Sobes.tech
Middle

Kuidas tühistada ülesande (task) täitmine C#-s?

sobes.tech AI

Vastus AI-lt

Ülesande tühistamiseks C#-s kasutatakse CancellationToken ja CancellationTokenSource mehhanismi.

  1. Loome CancellationTokenSource.
  2. CancellationTokenSource-st saadakse CancellationToken.
  3. CancellationToken antakse edasi meetodile, mis täidab ülesande.
  4. Täidetava meetodi sees kontrollitakse perioodiliselt omadust IsCancellationRequested.
  5. Kui IsCancellationRequested on true, visatakse OperationCanceledException või täidetakse muu lõpetamise loogika.
  6. Tühistamisnõude esitamiseks kutsutakse välja Cancel() meetod CancellationTokenSource objektil.

Näide kasutamisest:

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

// Tühistamiste tokenite allika loomine
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Ülesande loomine
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // Kontroll, kas on palutud tühistamine
            if (token.IsCancellationRequested)
            {
                // Visata `OperationCanceledException`
                token.ThrowIfCancellationRequested();
            }

            // Imitatsioonitöö
            Console.WriteLine($"Töötan... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // Tühistamise erandi töötlemine
        Console.WriteLine("Ülesanne tühistati.");
    }
    catch (Exception ex)
    {
        // Muude erandite töötlemine
        Console.WriteLine($"Viga: {ex.Message}");
    }
}, token); // Tokeni edastamine ülesandele

// Ootame teatud aega, siis palume tühistamist
Thread.Sleep(500);
Console.WriteLine("Tühistamisnõue...");
cts.Cancel();

// Ootame ülesande lõpetamist
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Erandite töötlemine, sh `OperationCanceledException`
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Tühistatud ülesanne lõpetati (Wait kaudu)." );
        }
        else
        {
            // Muude erandite töötlemine
            Console.WriteLine($"Viga ülesande lõpetamisel: {e.Message}");
        }
    }
}

Console.WriteLine("Peamine programm lõpetas.");

Alternatiivid:

  • Spetsiifilise väärtuse või lipu tagastamine ülesandest.
  • Väljast seatud lipu kontrollimine ilma CancellationToken-ita.

Kuid, CancellationToken on standardne ja soovitatav lähenemine tänu selle integratsioonile Task Parallel Library (TPL), asünkroonsete operatsioonide ja toetusega OperationCanceledException.