CancellationToken ile stream
CancellationToken ile async stream'i iptal etmeyi öğrenirsin.
CancellationToken ile stream
Bir async akış dışarıdan iptal edilebilmeli. CancellationToken parametresi ekleyerek bunu sağlarsın. Akış içinde token.ThrowIfCancellationRequested() ile her adımda iptali denetlersin.
Tüketici iptali iletmenin iki yolu vardır: await foreach'e .WithCancellation(token) eklemek ya da metoda doğrudan token parametresi geçirmek. Akış metodunun imzasına [EnumeratorCancellation] CancellationToken token eklersen, foreach token'ı otomatik geçirir.
ThrowIfCancellationRequested in stream
Bir async akışta ThrowIfCancellationRequested her öğeden önce çağrılır. İptal istenmişse OperationCanceledException fırlatılır ve akış biter. Örnek: foreach (var n in Numbers()) { token.ThrowIfCancellationRequested(); yield return n; }.
Bu desen, uzun akışları güvenli biçimde durdurmayı sağlar. Tüketici token'ı iptal ettiğinde akış bir sonraki adımda durur; kaynağı serbest bırakır. Bu, özellikle sınırsız akışlarda (örn. gerçek zamanlı veri) kritiktir.
Uygulama CancellationToken ile akış
static async IAsyncEnumerable<int> CountUp(CancellationToken token) metodunu tanımla. Gövdede for (int i = 1; i <= 5; i++) döngüsü aç; her adımda token.ThrowIfCancellationRequested();, await Task.CompletedTask; ve yield return 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 CountUp(cts.Token)) { sum += n; } ile topla, Console.WriteLine(sum); ile yazdır.
Örnek çözümü göster
CountUp gövdesinde for (int i = 1; i <= 5; i++) { token.ThrowIfCancellationRequested(); await Task.CompletedTask; yield return i; } yaz. Main'i static async Task Main() yapıp var cts = new CancellationTokenSource(); int sum = 0; await foreach (int n in CountUp(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> CountUp(CancellationToken token)
{
for (int i = 1; i <= 5; i++)
{
token.ThrowIfCancellationRequested();
await Task.CompletedTask;
yield return i;
}
}
static async Task Main()
{
var cts = new CancellationTokenSource();
int sum = 0;
await foreach (int n in CountUp(cts.Token))
{
sum += n;
}
Console.WriteLine(sum);
}
}
Kendini test et
-
Akış iptali kavramlarını eşleştir
- WithCancellation(token)
- foreach'e token geçirir
- ThrowIfCancellationRequested()
- İptal varsa fırlatır
- [EnumeratorCancellation]
- foreach otomatik geçirir
- CancellationToken
- İptal denetim türü
-
CancellationToken akışa nasıl geçer?
- Yalnızca global değişkenle
- Thread.Sleep ile
- WithCancellation(token) veya parametre olarak
- Task.Run ile
Cevabı göster
WithCancellation(token) veya parametre olarak — Doğru. WithCancellation(token) ya da metoda parametre olarak geçer.
-
WithCancellation çağrısını tamamla
await foreach (int n in Numbers().____(token)) { Console.WriteLine(n); }Cevabı göster
await foreach (int n in Numbers().WithCancellation(token)) { Console.WriteLine(n); }