Sobes.tech
Middle

Ako zrušiť vykonávanie úlohy (task) v C#?

sobes.tech AI

Odpoveď od AI

Za zrušenie úlohy v C# sa používa mechanizmus CancellationToken a CancellationTokenSource.

  1. Vytvorí sa CancellationTokenSource.
  2. Z CancellationTokenSource sa získa CancellationToken.
  3. CancellationToken sa odovzdá do metódy, ktorá vykonáva úlohu.
  4. Vo vnútri vykonávanej metódy sa periodicky kontroluje vlastnosť IsCancellationRequested tokenu.
  5. Ak je IsCancellationRequested rovné true, generuje sa OperationCanceledException alebo sa vykoná iná logika ukončenia.
  6. Pre požiadavku na zrušenie sa volá metóda Cancel() na objekte CancellationTokenSource.

Príklad použitia:

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

// Vytvorenie zdroja tokenov zrušenia
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Vytvorenie úlohy
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // Kontrola, či bola požiadavka na zrušenie
            if (token.IsCancellationRequested)
            {
                // Generovanie výnimky OperationCanceledException
                token.ThrowIfCancellationRequested();
            }

            // Simulácia práce
            Console.WriteLine($"Pracujem... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // Spracovanie výnimky zrušenia
        Console.WriteLine("Úloha bola zrušená.");
    }
    catch (Exception ex)
    {
        // Spracovanie iných výnimiek
        Console.WriteLine($"Došlo k chybe: {ex.Message}");
    }
}, token); // Odovzdanie tokenu do úlohy

// Čakanie určitý čas, potom požiadavka na zrušenie
Thread.Sleep(500);
Console.WriteLine("Žiadam o zrušenie...");
cts.Cancel();

// Čakanie na dokončenie úlohy
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Spracovanie výnimiek, vrátane OperationCanceledException
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Dokončená zrušená úloha (cez Wait).");
        }
        else
        {
            // Spracovanie iných výnimiek
            Console.WriteLine($"Chyba pri ukončení úlohy: {e.Message}");
        }
    }
}

Console.WriteLine("Hlavný program bol ukončený.");

Alternatívy:

  • Vrátenie špeciálnej hodnoty alebo vlajky z úlohy.
  • Kontrola vlajky nastavené zvonku bez použitia CancellationToken.

Avšak, CancellationToken je štandardný a odporúčaný prístup vďaka svojej integrácii s Task Parallel Library (TPL), asynchrónnymi operáciami a podporou OperationCanceledException.