CodeBlanks Logo Icon CodeBlanks

await foreach

C# kursu · İleri seviye · Ders 20/83

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

  1. 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); } }
  2. 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ü
  3. 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.

İleri seviye bölümündeki tüm dersler