Sobes.tech
Middle

Hoe annuleer je de uitvoering van een taak (task) in C#?

sobes.tech AI

Antwoord van AI

Om een taak in C# te annuleren, wordt het mechanisme CancellationToken en CancellationTokenSource gebruikt.

  1. Er wordt een CancellationTokenSource aangemaakt.
  2. Een CancellationToken wordt verkregen uit de CancellationTokenSource.
  3. De CancellationToken wordt doorgegeven aan de methode die de taak uitvoert.
  4. Binnen de lopende methode wordt periodiek gecontroleerd op de eigenschap IsCancellationRequested van de token.
  5. Als IsCancellationRequested op true staat, wordt een OperationCanceledException gegenereerd of wordt een andere beëindigingslogica uitgevoerd.
  6. Om de annulering aan te vragen, wordt de methode Cancel() op het CancellationTokenSource object aangeroepen.

Voorbeeld van gebruik:

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

// Maak een bron van annulerings tokens
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Maak een taak
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // Controleer of annulering is aangevraagd
            if (token.IsCancellationRequested)
            {
                // Genereer een OperationCanceledException
                token.ThrowIfCancellationRequested();
            }

            // Simuleer werk
            Console.WriteLine($"Bezig... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // Afhandeling van de annulering
        Console.WriteLine("Taak geannuleerd.");
    }
    catch (Exception ex)
    {
        // Afhandeling van andere uitzonderingen
        Console.WriteLine($"Fout: {ex.Message}");
    }
}, token); // Geef de token door aan de taak

// Wacht een beetje en vraag dan om annulering
Thread.Sleep(500);
Console.WriteLine("Vraag om annulering...");
cts.Cancel();

// Wacht tot de taak is voltooid
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Afhandeling van uitzonderingen, inclusief OperationCanceledException
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Geannuleerde taak voltooid (via Wait)." );
        }
        else
        {
            // Afhandeling van andere uitzonderingen
            Console.WriteLine($"Fout bij het beëindigen van de taak: {e.Message}");
        }
    }
}

Console.WriteLine("Hoofdprogramma is voltooid.");

Alternatieven:

  • Een speciale waarde of vlag retourneren vanuit de taak.
  • Een vlag die extern wordt ingesteld controleren, zonder CancellationToken te gebruiken.

Echter, CancellationToken is de standaard en aanbevolen aanpak vanwege de integratie met de Task Parallel Library (TPL), asynchrone operaties en ondersteuning voor OperationCanceledException.