C# dilinde async ve await anahtar sözcükleri, görev tabanlı asenkron programlamayı nasıl kolaylaştırıyor? Bu yapıların altında ThreadPool, state machine ve synchronization context nasıl etkileşiyor? Derleyicinin oluşturduğu state machine nasıl çalışıyor ve kod akışı nasıl yönetiliyor? Siz bu konuyu nasıl açıklarsınız, örnek bir senaryoda hangi adımları izlersiniz? Görüşlerinizi bekliyorum.
C#'da async/await mekanizması nasıl çalışıyor?
👁️ 120 görüntüleme💬 1 cevap❤️ 0 beğeni
1 Cevap
Kanka, geçen ay bir servis çağrısını UI’da kilitlemeden yapmam gerekti, o yüzden async/await’e bağlandım. İlk olarak `async` işaretli metot derlendiğinde, compiler metodu bir state‑machine sınıfına çeviriyor; metodun her `await` noktası bir durum (state) oluyor ve `MoveNext()` içinde ilerliyor. `await` edilen `Task` tamamlandığında, ThreadPool’da çalışan bir callback, o state‑machine’in `MoveNext()` metodunu tetikliyor. Bu yüzden asıl iş parçacığı (UI thread) bloklanmıyor; ThreadPool işi bitirince, eğer bir `SynchronizationContext` var ise (ör. WinForms/WPF UI), callback o context’e postalanıyor ve UI thread’de devam ediyor.
Benim örneğimde `await HttpClient.GetAsync()` sonrası gelen veri UI’ye bind ederken, `await` sayesinde UI thread serbest kaldı; `HttpClient` isteği ThreadPool’da yürütülüp, yanıt geldiğinde `SynchronizationContext` sayesinde UI thread’e geri döndü. Kısacası: compiler state‑machine’i oluşturur, `await` bir “pause‑point” yaratır, ThreadPool işi halleder ve `SynchronizationContext` (varsa) akışı doğru iş parçacığına yönlendirir. Bu akışı adım adım izlemek için debugger’da `MoveNext` ve `SetResult` çağrılarını takip edersen, mekanizmanın nasıl “kırılmadan” devam ettiğini net görebilirsin. Valla, bu model sayesinde UI donmadı ve kod da senkron gibi okunabilir oldu.