Sobes.tech
Middle

Kako otkazati izvršenje zadatka (task) u C#?

sobes.tech АИ

Одговор од АИ

Za otkaz od izvršenja zadatka u C# koristi se mehanizam CancellationToken i CancellationTokenSource.

  1. Kreira se CancellationTokenSource.
  2. Iz CancellationTokenSource se dobija CancellationToken.
  3. CancellationToken se prosleđuje metodi koja izvršava zadatak.
  4. Unutar izvršavane metode periodično se proverava svojstvo IsCancellationRequested tokena.
  5. Ako je IsCancellationRequested jednako true, generiše se OperationCanceledException ili se vrši druga logika za završetak.
  6. Za zahtev za otkazivanje se poziva metoda Cancel() na objektu CancellationTokenSource.

Primer upotrebe:

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

// Kreiranje izvora tokena za otkazivanje
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Kreiranje zadatka
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // Provera da li je zatraženo otkazivanje
            if (token.IsCancellationRequested)
            {
                // Generisanje izuzetka OperationCanceledException
                token.ThrowIfCancellationRequested();
            }

            // Simulacija rada
            Console.WriteLine($"Radim... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // Obrada izuzetka otkazivanja
        Console.WriteLine("Zadatak je otkazan.");
    }
    catch (Exception ex)
    {
        // Obrada drugih izuzetaka
        Console.WriteLine($"Došlo je do greške: {ex.Message}");
    }
}, token); // Prosleđivanje tokena u zadatak

// Čekanje određeno vreme, zatim zahtev za otkazivanje
Thread.Sleep(500);
Console.WriteLine("Zahtevam otkazivanje...");
cts.Cancel();

// Čekanje završetka zadatka
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Obrada izuzetaka, uključujući OperationCanceledException
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Završena otkazana zadatak (kroz Wait).");
        }
        else
        {
            // Obrada drugih izuzetaka
            Console.WriteLine($"Greška pri završetku zadatka: {e.Message}");
        }
    }
}

Console.WriteLine("Glavni program je završio.");

Alternativne opcije:

  • Vraćanje posebne vrednosti ili zastavice iz zadatka.
  • Provera zastavice postavljene spolja, bez korišćenja CancellationToken.

Međutim, CancellationToken je standardni i preporučeni pristup zbog svoje integracije sa Task Parallel Library (TPL), asinhronim operacijama i podrškom za OperationCanceledException.