Sobes.tech
Middle

C#-da vəzifənin (task) icrasını necə ləğv etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

C#-də bir tapşırığı ləğv etmək üçün CancellationTokenCancellationTokenSource mexanizmi istifadə olunur.

  1. CancellationTokenSource yaradılır.
  2. CancellationTokenSource-dan CancellationToken alınır.
  3. CancellationToken, tapşırığı icra edən metoda ötürülür.
  4. İcra olunan metod daxilində, müntəzəm olaraq IsCancellationRequested xüsusiyyəti yoxlanılır.
  5. Əgər IsCancellationRequested true olarsa, OperationCanceledException və ya başqa bir sonlandırma loqikası yaradılır.
  6. İptal üçün, CancellationTokenSource obyektində Cancel() metodu çağırılır.

İstifadə nümunəsi:

using System;
using System.Threading;
using System.Threading.Tasks;

// İptal token mənbəyi yaradılır
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Tapşırıq yaradılır
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // İptal istəyi yoxlanılır
            if (token.IsCancellationRequested)
            {
                // OperationCanceledException yaradılır
                token.ThrowIfCancellationRequested();
            }

            // İş simulyasiyası
            Console.WriteLine($"İşləyir... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // İptal istisnasını idarə et
        Console.WriteLine("Tapşırıq ləğv edildi.");
    }
    catch (Exception ex)
    {
        // Digər istisnaları idarə et
        Console.WriteLine($"Xəta baş verdi: {ex.Message}");
    }
}, token); // Token tapşırığa ötürülür

// Bir müddət gözləyin və sonra ləğv etməyi istəyin
Thread.Sleep(500);
Console.WriteLine("Ləğv etməyi istəyirəm...");
cts.Cancel();

// Tapşırığın tamamlanmasını gözləyin
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Xətaları idarə et, OperationCanceledException daxil olmaqla
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Ləğv edilmiş tapşırıq tamamlandı (Wait vasitəsilə)." );
        }
        else
        {
            // Digər xətaları idarə et
            Console.WriteLine($"Xəta: {e.Message}");
        }
    }
}

Console.WriteLine("Əsas proqram tamamlandı.");

Alternativlər:

  • Xüsusi dəyər və ya bayraq ilə geri dönüş.
  • Xaricdən qurulan bayrağı yoxlama, CancellationToken istifadə etmədən.

Lakin, CancellationToken standart və tövsiyə olunan yanaşmadır, çünki onun Task Parallel Library (TPL), asinxron əməliyyatlar və OperationCanceledException dəstəyi ilə yaxşı inteqrasiyası var.