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.
- Es wird ein
CancellationTokenSourceerstellt. - Ein
CancellationTokenwird vomCancellationTokenSourceabgerufen. - Das
CancellationTokenwird an eine Methode übergeben, die die Aufgabe ausführt. - Innerhalb der laufenden Methode wird regelmäßig die Eigenschaft
IsCancellationRequesteddes Tokens überprüft. - Wenn
IsCancellationRequestedauftruegesetzt ist, wird eineOperationCanceledExceptionausgelöst oder eine andere Beendigungslogik ausgeführt. - Um die Abbruchanfrage zu stellen, wird die Methode
Cancel()beimCancellationTokenSourceaufgerufen.
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.