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.
- Er wordt een
CancellationTokenSourceaangemaakt. - Een
CancellationTokenwordt verkregen uit deCancellationTokenSource. - De
CancellationTokenwordt doorgegeven aan de methode die de taak uitvoert. - Binnen de lopende methode wordt periodiek gecontroleerd op de eigenschap
IsCancellationRequestedvan de token. - Als
IsCancellationRequestedoptruestaat, wordt eenOperationCanceledExceptiongegenereerd of wordt een andere beëindigingslogica uitgevoerd. - Om de annulering aan te vragen, wordt de methode
Cancel()op hetCancellationTokenSourceobject 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
CancellationTokente gebruiken.
Echter, CancellationToken is de standaard en aanbevolen aanpak vanwege de integratie met de Task Parallel Library (TPL), asynchrone operaties en ondersteuning voor OperationCanceledException.