Middle
C#'ta bir görevi (task) nasıl iptal edebilirsiniz?
sobes.tech yapay zeka
AI'dan gelen yanıt
C#'ta bir görevi iptal etmek için CancellationToken ve CancellationTokenSource mekanizması kullanılır.
- Bir
CancellationTokenSourceoluşturulur. CancellationTokenSource'tan birCancellationTokenalınır.CancellationToken, görevi gerçekleştiren metoda iletilir.- Çalışmakta olan metodun içinde, periyodik olarak
IsCancellationRequestedözelliği kontrol edilir. - Eğer
IsCancellationRequestedtrueise, birOperationCanceledExceptionüretilir veya başka bir sonlandırma mantığı uygulanır. - İptal talebinde bulunmak için,
CancellationTokenSourceüzerindekiCancel()metodu çağrılır.
Kullanım örneği:
using System;
using System.Threading;
using System.Threading.Tasks;
// İptal token kaynağı oluşturma
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Görev oluşturma
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// İptal talebi olup olmadığını kontrol et
if (token.IsCancellationRequested)
{
// OperationCanceledException üret
token.ThrowIfCancellationRequested();
}
// Çalışmayı taklit et
Console.WriteLine($"Çalışıyor... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// İptal durumunu işle
Console.WriteLine("Görev iptal edildi.");
}
catch (Exception ex)
{
// Diğer hataları işle
Console.WriteLine($"Hata oluştu: {ex.Message}");
}
}, token); // Token'ı göreve ilet
// Bir süre bekle ve sonra iptal iste
Thread.Sleep(500);
Console.WriteLine("İptal isteği gönderiliyor...");
cts.Cancel();
// Görevin tamamlanmasını bekle
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Hataları işle, OperationCanceledException dahil
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("İptal edilen görev tamamlandı (Wait ile)." );
}
else
{
// Diğer hataları işle
Console.WriteLine($"Hata: {e.Message}");
}
}
}
Console.WriteLine("Ana program sona erdi.");
Alternatifler:
- Görevden özel bir değer veya bayrak döndürmek.
- Dışarıdan ayarlanmış bir bayrağı kontrol etmek,
CancellationTokenkullanmadan.
Ancak, CancellationToken standart ve önerilen yaklaşımdır çünkü Task Parallel Library (TPL), asenkron işlemler ve OperationCanceledException desteği ile entegrasyonu vardır.