Sobes.tech
Middle

Kā atcelt uzdevuma (task) izpildi C#?

sobes.tech AI

Atbilde no AI

Uzdevuma atcelšanai C# tiek izmantots CancellationToken un CancellationTokenSource mehānisms.

  1. Tiek izveidots CancellationTokenSource.
  2. No CancellationTokenSource tiek iegūts CancellationToken.
  3. CancellationToken tiek nodots metodam, kas veic uzdevumu.
  4. Iekš metodes periodiski pārbauda īpašumu IsCancellationRequested.
  5. Ja IsCancellationRequested ir true, tiek ģenerēta OperationCanceledException vai veikta cita pārtraukšanas loģika.
  6. Lai pieprasītu atcelšanu, tiek izsaukta Cancel() metode no CancellationTokenSource objekta.

Piemērs:

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

// Atcelšanas tokenu avota izveide
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Uzdevuma izveide
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // Pārbaude, vai ir pieprasīta atcelšana
            if (token.IsCancellationRequested)
            {
                // Ģenerēt `OperationCanceledException`
                token.ThrowIfCancellationRequested();
            }

            // Imitējošs darbs
            Console.WriteLine($"Strādāju... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // Atcelšanas izņēmuma apstrāde
        Console.WriteLine("Uzdevums tika atcelts.");
    }
    catch (Exception ex)
    {
        // Citu izņēmumu apstrāde
        Console.WriteLine($"Kļūda: {ex.Message}");
    }
}, token); // Nododam tokenu uzdevumam

// Gaida noteiktu laiku, pēc tam pieprasa atcelšanu
Thread.Sleep(500);
Console.WriteLine("Pieprasīju atcelšanu...");
cts.Cancel();

// Gaida uzdevuma pabeigšanu
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Apstrādā izņēmumus, ieskaitot `OperationCanceledException`
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Atceltais uzdevums pabeigts (caur Wait).");
        }
        else
        {
            // Apstrādā citus izņēmumus
            Console.WriteLine($"Kļūda, pabeidzot uzdevumu: {e.Message}");
        }
    }
}

Console.WriteLine("Galvenā programma ir pabeigta.");

Alternatīvas:

  • Īpašas vērtības vai zīmi atgriezt no uzdevuma.
  • Pārbaudīt ārēji iestatītu zīmi bez CancellationToken.

Tomēr, CancellationToken ir standarta un ieteicams pieeja, pateicoties tā integrācijai ar Task Parallel Library (TPL), asīnhroniskajām operācijām un atbalstam OperationCanceledException.