yield return async
async iterator metodu yazmayı ve yield return await'i öğrenirsin.
yield return async
yield return bir akışa öğe üretir ve duraklatır. async IAsyncEnumerable<T> metodunda her yield return öğeyi tüketiciye gönderir; tüketici await foreach ile bir sonraki öğeyi isteyene kadar bekler.
İki yield return arasına await koyarak giriş/çıkış bekleyebilirsin. Örnek: await Task.CompletedTask; yield return 1; await Task.CompletedTask; yield return 2;. Bu, gerçek bir veritabanı akışında her satır için beklemek gibi senaryolarda kullanılır.
Akış üretimi
Bir async akışta birden çok yield return yan yana gelebilir. Her biri ayrı bir öğe olarak üretilir. Örnek: yield return 1; yield return 2; yield return 3; üç öğeli bir akış verir.
Akış içinde koşullu olarak da üretebilirsin: if (n > 0) yield return n;. yield break ile akışı erken bitirebilirsin. Bu, senkron yineleyicilerde (IEnumerable) kullanılan yield ile birebir aynıdır; yalnızca async olarak çalışır.
Uygulama yield return ile akış
static async IAsyncEnumerable<int> Evens() metodunu tanımla. Gövdede await Task.CompletedTask;, yield return 2;, yield return 4;, yield return 6; yaz. Main'i static async Task Main yap. int sum = 0; await foreach (int n in Evens()) { sum += n; } ile topla, Console.WriteLine(sum); ile yazdır.
Örnek çözümü göster
Evens gövdesinde await Task.CompletedTask; yield return 2; yield return 4; yield return 6; yaz. Main'i static async Task Main() yapıp int sum = 0; await foreach (int n in Evens()) { sum += n; } Console.WriteLine(sum);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async IAsyncEnumerable<int> Evens()
{
await Task.CompletedTask;
yield return 2;
yield return 4;
yield return 6;
}
static async Task Main()
{
int sum = 0;
await foreach (int n in Evens())
{
sum += n;
}
Console.WriteLine(sum);
}
}
Kendini test et
-
yield return ne yapar?
- Akışa bir öğe üretir ve duraklatır
- Metoddan çıkar
- Bir Task bekler
- Bir hata fırlatır
Cevabı göster
Akışa bir öğe üretir ve duraklatır — Doğru. yield return akışa bir öğe üretir ve duraklatır.
-
yield return tamamla
yield ____ 42;Cevabı göster
yield return 42; -
yield return'ler arasına ne konabilir?
- Yalnızca return
- await ile bekleme
- Thread.Sleep
- lock deyimi
Cevabı göster
await ile bekleme — Doğru. yield return'ler arasına await ile bekleme konabilir.