Async Streams¶
Async streams, veri akışlarını asenkron olarak işlemek için güçlü bir araçtır. Doğru şekilde kullanıldığında performansı artırır ve kodunuzu daha verimli hale getirir. Ancak, yanlış kullanımlar performans sorunlarına ve beklenmeyen davranışlara yol açabilir.
1. Asenkron Akışların Yanlış Kullanımı¶
❌ Yanlış Kullanım: Tüm veri setini bellekte tutarak işlem yapmak.
var data = await GetDataAsync();
foreach (var item in data)
{
Console.WriteLine(item);
}
✅ İdeal Kullanım: Asenkron veri akışını await foreach
ile tüketmek.
await foreach (var item in GetDataAsync())
{
Console.WriteLine(item);
}
2. Exception Yönetimini İhmal Etmek¶
❌ Yanlış Kullanım: Asenkron akışlar sırasında hataları göz ardı etmek.
await foreach (var data in GetDataAsync())
{
ProcessData(data); // Hataları ele almaz
}
✅ İdeal Kullanım: Hataları try-catch
bloğu ile yönetmek.
try
{
await foreach (var data in GetDataAsync())
{
ProcessData(data);
}
}
catch (Exception ex)
{
Console.WriteLine($"Hata: {ex.Message}");
}
3. Performansı Optimize Etmemek¶
❌ Yanlış Kullanım: Tüm elemanları aynı anda işlemek.
await foreach (var item in GetLargeDataAsync())
{
ProcessItem(item);
}
✅ İdeal Kullanım: Akışın erken sonlandırılabileceği durumlarda döngüyü zamanında durdurmak.
await foreach (var item in GetLargeDataAsync())
{
if (ShouldStopProcessing(item)) break;
ProcessItem(item);
}
4. CancellationToken
Kullanımını İhmal Etmek¶
❌ Yanlış Kullanım: Asenkron akışlarda iptal desteğini göz ardı etmek.
await foreach (var item in GetDataAsync())
{
Console.WriteLine(item);
}
✅ İdeal Kullanım: CancellationToken
kullanarak işlem iptalini desteklemek.
await foreach (var item in GetDataAsync().WithCancellation(cancellationToken))
{
Console.WriteLine(item);
}
5. Gereksiz Veri Filtreleme¶
❌ Yanlış Kullanım: Akıştan alınan verileri döngü içinde filtrelemek.
await foreach (var item in GetDataAsync())
{
if (item.IsRelevant)
{
Console.WriteLine(item);
}
}
✅ İdeal Kullanım: Akış sırasında veri filtrelemeyi optimize etmek.
await foreach (var item in GetFilteredDataAsync())
{
Console.WriteLine(item);
}
6. Bağımsız İşlemleri Senkronize Çalıştırmak¶
❌ Yanlış Kullanım: Bağımsız işlemleri sırayla çalıştırmak.
await foreach (var item in GetDataAsync())
{
await ProcessItemAsync(item); // Bağımsız işlemler sıralı çalışır
}
✅ İdeal Kullanım: İşlemleri paralel olarak çalıştırmak için Task.WhenAll
kullanın.
var tasks = new List<Task>();
await foreach (var item in GetDataAsync())
{
tasks.Add(ProcessItemAsync(item));
}
await Task.WhenAll(tasks);