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 Program
2{
3public static void Main()
4{
5// Bu deadlock yaratır!
6string sonuc = GetDataAsync().Result;
7Console.WriteLine(sonuc);
8}
9
10public 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 Program
2{
3public static async Task Main()
4{
5string sonuc = await GetDataAsync();
6Console.WriteLine(sonuc);
7}
8
9public static async Task<string> GetDataAsync()
10{
11await Task.Delay(100);
12return "Veri Alındı";
13}
14}
15
16// Çıktı: Veri Alındı

Fire-and-forget (başlat ve unut) yöntemi hataları gizler.

Yanlış:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1public async void ProcessData()
2{
3await Task.Delay(100);
4throw new Exception("Hata oluştu!"); // Bu exception gözlemlenmiyor
5}

Doğru:

1public async Task ProcessData()
2{
3await Task.Delay(100);
4throw new Exception("Hata oluştu!");
5}
6
7// Çağrıda:
8try
9{
10await ProcessData();
11}
12catch (Exception ex)
13{
14Console.WriteLine($"Hata yakalandı: {ex.Message}");
15}
16
17// Çı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 kaybedilmez
4var 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);
4
5// 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz