Middle
Comment annuler l'exécution d'une tâche (task) en C#?
sobes.tech IA
Réponse de l'IA
Pour annuler l'exécution d'une tâche en C#, on utilise le mécanisme CancellationToken et CancellationTokenSource.
- Créer un
CancellationTokenSource. - Obtenir un
CancellationTokenà partir duCancellationTokenSource. - Passer le
CancellationTokenà une méthode qui exécute la tâche. - À l'intérieur de la méthode en cours d'exécution, vérifier périodiquement la propriété
IsCancellationRequesteddu token. - Si
IsCancellationRequestedesttrue, générer uneOperationCanceledExceptionou appliquer une autre logique de terminaison. - Pour demander l'annulation, appeler la méthode
Cancel()sur l'objetCancellationTokenSource.
Exemple d'utilisation :
using System;
using System.Threading;
using System.Threading.Tasks;
// Créer une source de tokens d'annulation
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Créer une tâche
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// Vérifier si une annulation a été demandée
if (token.IsCancellationRequested)
{
// Générer une exception OperationCanceledException
token.ThrowIfCancellationRequested();
}
// Simulation de travail
Console.WriteLine($"Travail en cours... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// Gérer l'exception d'annulation
Console.WriteLine("Tâche annulée.");
}
catch (Exception ex)
{
// Gérer d'autres exceptions
Console.WriteLine($"Une erreur est survenue : {ex.Message}");
}
}, token); // Passer le token à la tâche
// Attendre un peu, puis demander l'annulation
Thread.Sleep(500);
Console.WriteLine("Demande d'annulation...");
cts.Cancel();
// Attendre la fin de la tâche
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Gérer les exceptions, y compris OperationCanceledException
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("Tâche annulée (via Wait)." );
}
else
{
// Gérer d'autres exceptions
Console.WriteLine($"Erreur lors de la fin de la tâche : {e.Message}");
}
}
}
Console.WriteLine("Programme principal terminé.");
Alternatives :
- Retourner une valeur spéciale ou un drapeau depuis la tâche.
- Vérifier un drapeau défini à l'extérieur, sans utiliser
CancellationToken.
Cependant, CancellationToken est la méthode standard et recommandée grâce à son intégration avec la Task Parallel Library (TPL), les opérations asynchrones et la prise en charge de OperationCanceledException.