Sobes.tech
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.

  1. Bir CancellationTokenSource oluşturulur.
  2. CancellationTokenSource'tan bir CancellationToken alınır.
  3. CancellationToken, görevi gerçekleştiren metoda iletilir.
  4. Çalışmakta olan metodun içinde, periyodik olarak IsCancellationRequested özelliği kontrol edilir.
  5. Eğer IsCancellationRequested true ise, bir OperationCanceledException üretilir veya başka bir sonlandırma mantığı uygulanır.
  6. İptal talebinde bulunmak için, CancellationTokenSource üzerindeki Cancel() 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, CancellationToken kullanmadan.

Ancak, CancellationToken standart ve önerilen yaklaşımdır çünkü Task Parallel Library (TPL), asenkron işlemler ve OperationCanceledException desteği ile entegrasyonu vardır.