CancellationToken ile Uzun İşlemleri Durdurma

Uzun süren bir işlem varsa ve kullanıcı "dur" butonuna basarsa ne olur? Kod çalışmaya devam eder, bellek boşa gider, kaynaklar tıkanır. bu noktada CancellationToken devreye giriyor.

CancellationToken, bir işlemi dışarıdan iptal etmek için C#'ta standart yol. Async metotlara verilen bu token sayesinde işlem başka bir thread'den durdurulabilir. Önemli olan, işlemin içinde düzenli olarak token kontrol etmek.

Basit bir örnek ile başlayalım. Bir dosya indirme işlemini simüle edelim:

1using System;
2using System.Threading;
3using System.Threading.Tasks;
4
5class Program
6{
7static async Task Main()
8{
9var cts = new CancellationTokenSource();
10var token = cts.Token;
11
12// 5 saniye sonra otomatik iptal et
13cts.CancelAfter(TimeSpan.FromSeconds(5));
14
15try
16{
17await IndirmeYap(token);
18}
19catch (OperationCanceledException)
20{
21Console.WriteLine("İndirme kullanıcı tarafından durduruldu.");
22}
23}
24
25static async Task IndirmeYap(CancellationToken token)
26{
27for (int i = 0; i < 100; i++)
28{
29// Token kontrol et, iptal edilmişse exception fırlat
30token.ThrowIfCancellationRequested();
31
32Console.WriteLine($"İndirme: {i}% tamamlandı");
33await Task.Delay(100); // Gerçek işi simüle et
34}
35Console.WriteLine("İndirme tamamlandı.");
36}
37}

Beklenen çıktı: 5 saniye sonra "İndirme kullanıcı tarafından durduruldu." mesajı.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Burada üç önemli nokta var. Birincisi, CancellationTokenSource ile token oluşturuyoruz. İkincisi, CancelAfter ile otomatik süre atıyoruz (isteğe bağlı). Üçüncüsü, döngü içinde ThrowIfCancellationRequested() çağırarak token durumunu kontrol ediyoruz.

Eğer elle iptal etmek istersen:

1var cts = new CancellationTokenSource();
2var token = cts.Token;
3
4var task = IndirmeYap(token);
5
6// Başka bir yerden (örneğin buton tıklaması):
7await Task.Delay(3000);
8cts.Cancel(); // İşlemi durdur
9
10await task;

Sık yapılan hata: Token kontrol etmeden uzun döngü yazmak. Eğer ThrowIfCancellationRequested() çağırmazsan, token iptal edilse bile işlem devam eder. Ayrıca CancellationTokenSource'u using bloğu içinde kullan, yoksa kaynaklar serbest bırakılmaz.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz