await foreach
await foreach ile async stream'i tüketmeyi öğrenirsin.
await foreach
await foreach, bir IAsyncEnumerable<T>'ın her öğesini sırayla bekleyerek tüketir. Bildirim: await foreach (int n in Stream()) { ... }. Her döngü adımında bir sonraki öğe için await edilir.
Bu, senkron foreach'in async karşılığıdır. await anahtar kelimesi her öğenin async olarak üretilmesini bekler. Böylece giriş/çıkış beklerken iş parçacığı bloklanmaz; akış tamamlanınca döngü biter.
await foreach ve foreach farkı
Senkron foreach bir IEnumerable<T> üzerinde çalışır; öğeleri hemen alır. await foreach ise IAsyncEnumerable<T> üzerinde çalışır; her öğeyi async bekler.
Bir IAsyncEnumerable'ı senkron foreach ile tüketmeye çalışırsan derleme hatası alırsın; çünkü öğe bir Task içinde gelir. await foreach, bu Task'ları otomatik açar.
Uygulama await foreach ile tüket
static async IAsyncEnumerable<string> Words() metodunu tanımla. Gövdede await Task.CompletedTask;, yield return "elma";, yield return "armut";, yield return "kiraz"; yaz. Main'i static async Task Main yap. int count = 0; await foreach (string w in Words()) { count++; } ile say, Console.WriteLine(count); ile yazdır.
Örnek çözümü göster
Words gövdesinde await Task.CompletedTask; yield return "elma"; yield return "armut"; yield return "kiraz"; yaz. Main'i static async Task Main() yapıp int count = 0; await foreach (string w in Words()) { count++; } Console.WriteLine(count);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async IAsyncEnumerable<string> Words()
{
await Task.CompletedTask;
yield return "elma";
yield return "armut";
yield return "kiraz";
}
static async Task Main()
{
int count = 0;
await foreach (string w in Words())
{
count++;
}
Console.WriteLine(count);
}
}
Kendini test et
-
await foreach tamamla
static async Task Consume() { ____ foreach (int n in Stream()) { Console.WriteLine(n); } }Cevabı göster
static async Task Consume() { await foreach (int n in Stream()) { Console.WriteLine(n); } } -
foreach kavramlarını eşleştir
- foreach
- IEnumerable<T> tüketir
- await foreach
- IAsyncEnumerable<T> tüketir
- yield return
- Akışa öğe üretir
- IAsyncEnumerable<T>
- Async akış türü
-
await foreach hangi tür üzerinde çalışır?
- IEnumerable<T>
- List<T>
- Task<T>
- IAsyncEnumerable<T>
Cevabı göster
IAsyncEnumerable<T> — Doğru. await foreach bir IAsyncEnumerable<T> gerektirir.