Sobes.tech
Middle

Wie kann man die Ausführung einer Aufgabe (Task) in C# abbrechen?

sobes.tech KI

Antwort von AI

Um eine Aufgabe in C# abzubrechen, verwendet man den Mechanismus CancellationToken und CancellationTokenSource.

  1. Es wird ein CancellationTokenSource erstellt.
  2. Ein CancellationToken wird vom CancellationTokenSource abgerufen.
  3. Das CancellationToken wird an eine Methode übergeben, die die Aufgabe ausführt.
  4. Innerhalb der laufenden Methode wird regelmäßig die Eigenschaft IsCancellationRequested des Tokens überprüft.
  5. Wenn IsCancellationRequested auf true gesetzt ist, wird eine OperationCanceledException ausgelöst oder eine andere Beendigungslogik ausgeführt.
  6. Um die Abbruchanfrage zu stellen, wird die Methode Cancel() beim CancellationTokenSource aufgerufen.

Beispiel für die Verwendung:

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

// Erstellen einer Abbruch-Token-Quelle
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Erstellen einer Aufgabe
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // Überprüfen, ob eine Abbruchanfrage vorliegt
            if (token.IsCancellationRequested)
            {
                // Exception OperationCanceledException auslösen
                token.ThrowIfCancellationRequested();
            }

            // Arbeit simulieren
            Console.WriteLine($"Arbeit... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // Behandlung der Abbruch-Exception
        Console.WriteLine("Aufgabe abgebrochen.");
    }
    catch (Exception ex)
    {
        // Behandlung anderer Ausnahmen
        Console.WriteLine($"Fehler aufgetreten: {ex.Message}");
    }
}, token); // Token an die Aufgabe übergeben

// Warten, dann Abbruch anfordern
Thread.Sleep(500);
Console.WriteLine("Abbruch anfordern...");
cts.Cancel();

// Warten auf Abschluss der Aufgabe
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Behandlung von Ausnahmen, inklusive OperationCanceledException
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Abgebrochene Aufgabe beendet (über Wait)." );
        }
        else
        {
            // Behandlung anderer Ausnahmen
            Console.WriteLine($"Fehler beim Beenden der Aufgabe: {e.Message}");
        }
    }
}

Console.WriteLine("Hauptprogramm beendet.");

Alternativen:

  • Rückgabe eines speziellen Werts oder Flags aus der Aufgabe.
  • Überprüfung eines extern gesetzten Flags ohne Verwendung von CancellationToken.

Allerdings ist CancellationToken der Standard- und empfohlene Ansatz, da er gut in die Task Parallel Library (TPL), asynchrone Operationen und die Unterstützung von OperationCanceledException integriert ist.