Async Void Metod Yazmanın Tehlikeleri ve Çözümleri
Async void metod yazmak, C# dilinde yapılan en yaygın hatalardan biri. Görünüşte basit ve çalışıyor gibi görünse de, arka planda ciddi sorunlara yol açar.
Async void'in ilk sorunu istisna yönetimi. Normal bir metod içinde fırlatılan istisna (exception) çağıran koda ulaşır ve orada yakalanabilir. Ama async void'de fırlatılan istisna, ThreadPool üzerinde çalışan bir görevde ortaya çıkar. Kimse onu yakalamaz ve uygulama aniden çöker.
1// YANLIŞ: Async void2private async void FetchDataWrong()3{4var result = await httpClient.GetAsync("https://api.example.com/data");5// Burada istisna fırlarsa, hiç kimse yakalamaz!6}78// DOĞRU: Async Task9private async Task FetchDataCorrect()10{11var result = await httpClient.GetAsync("https://api.example.com/data");12// İstisnalar çağıran koda ulaşır13}İkinci sorun, hata takibi ve hata ayıklama zorluğu. Async void metod çağırıldığında, çağıran kod hemen devam eder; görev arka planda sessizce başarısız olabilir. Kullanıcı hiçbir bildirim almaz, log kaydı olmaz.
Üçüncü sorun ise uygulamanın çökmesi. Async void'deki yakalanmayan istisna, tüm uygulamayı düşürebilir. Özellikle web uygulamalarında veya servis uygulamalarında bu felaket olur.
1// Doğru kullanım: Task döndür, çağrıda await et2public async Task ProcessUserAsync(int userId)3{4try5{6var user = await GetUserAsync(userId);7await SaveUserAsync(user);8}9catch (Exception ex)10{11logger.LogError(ex, "Kullanıcı işleme başarısız");12throw; // Veya uygun şekilde işle13}14}1516// Çağrı17await ProcessUserAsync(123);Async void'in tek yasal kullanım yeri, olay işleyicileridir (event handler). Orada async void kabul edilir, çünkü çağıran kod yoktur.
1// Bu durum UYGUN: Event handler2private async void Button_Click(object sender, EventArgs e)3{4await FetchAndDisplayDataAsync();5}Özet: Event handler dışında asla async void kullanma. Hep async Task döndür. Bu şekilde istisnalar kontrol altında kalır, hata takibi mümkün olur ve uygulama güvenli kalır.
0 yorum