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;45class Program6{7static async Task Main()8{9var cts = new CancellationTokenSource();10var token = cts.Token;1112// 5 saniye sonra otomatik iptal et13cts.CancelAfter(TimeSpan.FromSeconds(5));1415try16{17await IndirmeYap(token);18}19catch (OperationCanceledException)20{21Console.WriteLine("İndirme kullanıcı tarafından durduruldu.");22}23}2425static async Task IndirmeYap(CancellationToken token)26{27for (int i = 0; i < 100; i++)28{29// Token kontrol et, iptal edilmişse exception fırlat30token.ThrowIfCancellationRequested();3132Console.WriteLine($"İndirme: {i}% tamamlandı");33await Task.Delay(100); // Gerçek işi simüle et34}35Console.WriteLine("İndirme tamamlandı.");36}37}Beklenen çıktı: 5 saniye sonra "İndirme kullanıcı tarafından durduruldu." mesajı.
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;34var task = IndirmeYap(token);56// Başka bir yerden (örneğin buton tıklaması):7await Task.Delay(3000);8cts.Cancel(); // İşlemi durdur910await 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.
0 yorum