C# async/await: Yaygın Tuzaklar ve Çözümleri
Async/await, uzun süreli işlemleri engellemeden çalıştırmayı sağlar. Ancak yanlış kullanımda deadlock, exception kayıpları ve thread pool tıkanıklığı gibi sorunlar ortaya çıkar. en sık rastlanan tuzaklar ve nasıl çıkılacağı.
Asyncron bir metodun sonucunu `.Result` ile almaya çalışmak, aynı thread'i bekletip deadlock yaratır.
Yanlış Kullanım:
1public class Program2{3public static void Main()4{5// Bu deadlock yaratır!6string sonuc = GetDataAsync().Result;7Console.WriteLine(sonuc);8}910public static async Task<string> GetDataAsync()11{12await Task.Delay(100);13return "Veri Alındı";14}15}Çözüm: Main'i async yap veya await kullan:
1public class Program2{3public static async Task Main()4{5string sonuc = await GetDataAsync();6Console.WriteLine(sonuc);7}89public static async Task<string> GetDataAsync()10{11await Task.Delay(100);12return "Veri Alındı";13}14}1516// Çıktı: Veri AlındıFire-and-forget (başlat ve unut) yöntemi hataları gizler.
Yanlış:
1public async void ProcessData()2{3await Task.Delay(100);4throw new Exception("Hata oluştu!"); // Bu exception gözlemlenmiyor5}Doğru:
1public async Task ProcessData()2{3await Task.Delay(100);4throw new Exception("Hata oluştu!");5}67// Çağrıda:8try9{10await ProcessData();11}12catch (Exception ex)13{14Console.WriteLine($"Hata yakalandı: {ex.Message}");15}1617// Çıktı: Hata yakalandı: Hata oluştu!Kural: `async void` sadece event handler'lar için kullan. Metod değerleri dönüyorsa `Task<T>`, dönmüyorsa `Task` kullan.
UI thread'i olmayan ortamlarda (ASP.NET Core gibi) `.ConfigureAwait(false)` kullanmak gerekir.
1public async Task<string> GetDataAsync()2{3// ConfigureAwait(false) ile context kaybedilmez4var response = await Task.Delay(100).ConfigureAwait(false);5return "Başarılı";6}1// Yanlış: Sırayla çalışır (200ms)2await GetDataAsync(1);3await GetDataAsync(2);45// Doğru: Paralel çalışır (100ms)6await Task.WhenAll(GetDataAsync(1), GetDataAsync(2));- `.Result` yerine `await` kullan
- `async void` sadece event handler'larda
- Exception handling'i ihmal etme
- UI olmayan ortamlarda `.ConfigureAwait(false)` ekle
- Paralel işlemler için `Task.WhenAll()` kullan
Bu kuralları takip etmek, async kodunuzu güvenli ve performanslı hale getirir.
0 yorum