C#
CancellationToken
CancellationToken ile task'ı iptal etmeyi öğrenirsin.
CancellationToken nedir?
CancellationToken, uzun bir işi dışarıdan iptal etmenin standart yoludur. Bir CancellationTokenSource üretir, ondan bir Token alıp metoda geçirirsin. İptal etmek için cts.Cancel(); çağırırsın.
Metot içinde token.ThrowIfCancellationRequested() ile her döngü adımında kontrol edersin. İptal istenmişse OperationCanceledException fırlatılır. Bu, iş parçacığını zorla öldürmekten daha güvenlidir.
ThrowIfCancellationRequested
Bir döngü içinde token.ThrowIfCancellationRequested() çağırarak iptali denetlersin. İptal istenmişse bu çağrı hemen OperationCanceledException fırlatır; değilse bir şey yapmaz. Bu nedenle çağrı ucuz ve sık yapılabilir.
İptal edilen metot genellikle OperationCanceledException fırlatır; çağıran bunu catch ile yakalar ve iptali beklenen bir sonuç olarak yorumlar. İptal bir hata değil, beklenen bir denetim akışıdır.
Uygulama CancellationToken ile döngü
static async Task<int> CountAsync(CancellationToken token) metodunu tanımla. Gövdede int sum = 0; ile başla, for (int i = 1; i <= 3; i++) döngüsünde her adımda token.ThrowIfCancellationRequested();, await Task.CompletedTask; ve sum += i; yap; döngüden sonra return sum;. Main'i static async Task Main yap; var cts = new CancellationTokenSource(); ile kaynak oluştur, int total = await CountAsync(cts.Token); ile çağır ve Console.WriteLine(total); ile yazdır.
Örnek çözümü göster
CountAsync gövdesinde int sum = 0; ile başla. for (int i = 1; i <= 3; i++) döngüsünde token.ThrowIfCancellationRequested(); await Task.CompletedTask; sum += i; yap. Döngüden sonra return sum;. Main'i static async Task Main() yapıp var cts = new CancellationTokenSource(); int total = await CountAsync(cts.Token); Console.WriteLine(total);
Örnek çözüm:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task<int> CountAsync(CancellationToken token)
{
int sum = 0;
for (int i = 1; i <= 3; i++)
{
token.ThrowIfCancellationRequested();
await Task.CompletedTask;
sum += i;
}
return sum;
}
static async Task Main()
{
var cts = new CancellationTokenSource();
int total = await CountAsync(cts.Token);
Console.WriteLine(total);
}
}
Kendini test et
-
CancellationTokenSource oluştur
var cts = new CancellationToken____();
Cevabı göster
var cts = new CancellationTokenSource();
-
İptal etmek için ne çağrılır?
- token.Cancel()
- cts.Cancelled = true
- cts.Stop()
- cts.Cancel()
Cevabı göster
cts.Cancel() — Doğru. cts.Cancel() iptali tetikler; token ThrowIfCancellationRequested'i fırlatır.
-
CancellationToken kavramlarını eşleştir
- CancellationTokenSource
- İptal kaynağı
- Token
- Metoda geçirilen denetim
- ThrowIfCancellationRequested
- İptal varsa fırlatır
- cts.Cancel()
- İptali tetikler
Sıradaki ders: Özet - Task ve ContinueWith