C#
Özet - Async streams
IAsyncEnumerable, await foreach ve Channel'ı birleştirerek bir log akışı yazarsın.
Özet - Async streams
Bu grupta async akışların temellerini öğrendin: IAsyncEnumerable<T> async değer akışı üretir; await foreach ile tüketilir; yield return ile öğe üretilir. CancellationToken ile akış iptal edilir; System.Threading.Channels ile üretici-tüketici kuyruğu kurulur.
En önemli ders: büyük veriyi tek seferde değil, parça parça akıt. Bu, bellek kullanımını düşürür ve gecikmeyi azaltır. Şimdi tüm bunları birleştiren bir uygulama yazacağız.
Uygulama IAsyncEnumerable + cancellation birleştir
static async IAsyncEnumerable<int> Squares(CancellationToken token) metodunu tanımla. Gövdede for (int i = 1; i <= 3; i++) döngüsü aç; her adımda token.ThrowIfCancellationRequested();, await Task.CompletedTask; ve yield return i * i; yap. Main'i static async Task Main yap; var cts = new CancellationTokenSource(); ile kaynak oluştur (iptal etme). int sum = 0; await foreach (int n in Squares(cts.Token)) { sum += n; } ile topla, Console.WriteLine(sum); ile yazdır.
Örnek çözümü göster
Squares gövdesinde for (int i = 1; i <= 3; i++) { token.ThrowIfCancellationRequested(); await Task.CompletedTask; yield return i * i; } yaz. Main'i static async Task Main() yapıp var cts = new CancellationTokenSource(); int sum = 0; await foreach (int n in Squares(cts.Token)) { sum += n; } Console.WriteLine(sum);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async IAsyncEnumerable<int> Squares(CancellationToken token)
{
for (int i = 1; i <= 3; i++)
{
token.ThrowIfCancellationRequested();
await Task.CompletedTask;
yield return i * i;
}
}
static async Task Main()
{
var cts = new CancellationTokenSource();
int sum = 0;
await foreach (int n in Squares(cts.Token))
{
sum += n;
}
Console.WriteLine(sum);
}
}
İpuçları
Birkaç ipucu: büyük veriyi IAsyncEnumerable ile akıt; tüm listeyi beklemekten kaçın. Her async akışa CancellationToken parametresi ekle ve her öğeden önce ThrowIfCancellationRequested çağır.
Üretici-tüketici için System.Threading.Channels kullan; üretim ve tüketim hızları farklıysa idealdir. await foreach tüketicinin standart aracıdır; yield return üreticinin standart aracıdır.
Uygulama Mini uygulama: Katları akıt
static async IAsyncEnumerable<int> MultiplesOf(int k, CancellationToken token) metodunu tanımla. Gövdede for (int i = 1; i <= 4; i++) döngüsü aç; her adımda token.ThrowIfCancellationRequested();, await Task.CompletedTask; ve yield return k * i; yap. Main'i static async Task Main yap; var cts = new CancellationTokenSource(); ile kaynak oluştur. int sum = 0; await foreach (int n in MultiplesOf(5, cts.Token)) { sum += n; } ile topla, Console.WriteLine(sum); ile yazdır (5+10+15+20 = 50).
Örnek çözümü göster
MultiplesOf gövdesinde for (int i = 1; i <= 4; i++) { token.ThrowIfCancellationRequested(); await Task.CompletedTask; yield return k * i; } yaz. Main'i static async Task Main() yapıp var cts = new CancellationTokenSource(); int sum = 0; await foreach (int n in MultiplesOf(5, cts.Token)) { sum += n; } Console.WriteLine(sum);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async IAsyncEnumerable<int> MultiplesOf(int k, CancellationToken token)
{
for (int i = 1; i <= 4; i++)
{
token.ThrowIfCancellationRequested();
await Task.CompletedTask;
yield return k * i;
}
}
static async Task Main()
{
var cts = new CancellationTokenSource();
int sum = 0;
await foreach (int n in MultiplesOf(5, cts.Token))
{
sum += n;
}
Console.WriteLine(sum);
}
}
Kendini test et
-
IAsyncEnumerable'ı tüketen deyim hangisi?
- await foreach
- for
- while
- lock
Cevabı göster
await foreach — Doğru. await foreach IAsyncEnumerable'ı tüketir.
Sıradaki ders: GroupBy