Annuler des tâches avec CancellationToken en .NET
Le CancellationToken est un objet .NET puissant qui permet d'annuler des opérations asynchrones en cours. Il offre un moyen propre et fiable de gérer les interruptions de tâches longues et de prévenir les blocages inutiles.
Comment utiliser CancellationToken
1. Créer un CancellationTokenSource:
Commencez par créer un CancellationTokenSource
, qui est responsable de la gestion du CancellationToken
.
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
2. Passer le CancellationToken aux méthodes asynchrones:
Passez le CancellationToken
à toutes les méthodes asynchrones qui peuvent être annulées. Utilisez le paramètre CancellationToken
pour indiquer que la tâche peut être annulée.
async Task LongRunningTask(CancellationToken token)
{
// ...
while (!token.IsCancellationRequested)
{
// Effectuer des tâches
await Task.Delay(1000, token); // Vérifier l'annulation chaque seconde
}
// ...
}
3. Vérifier l'état d'annulation:
Dans la méthode asynchrone, utilisez la propriété IsCancellationRequested
du CancellationToken
pour vérifier si l'annulation a été demandée.
4. Annuler la tâche:
Pour annuler la tâche, appelez la méthode Cancel()
sur le CancellationTokenSource
.
// Annuler la tâche après 5 secondes
Task.Delay(5000).ContinueWith(_ => source.Cancel());
Exemple pratique
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static async Task Main(string[] args)
{
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
// Démarrer une tâche longue
Task task = LongRunningTask(token);
// Annuler la tâche après 5 secondes
Task.Delay(5000).ContinueWith(_ => source.Cancel());
try
{
await task;
}
catch (OperationCanceledException)
{
Console.WriteLine("Tâche annulée !");
}
Console.ReadLine();
}
static async Task LongRunningTask(CancellationToken token)
{
Console.WriteLine("Démarrage de la tâche longue...");
for (int i = 0; i < 10; i++)
{
Console.WriteLine($"Étape {i+1}...");
await Task.Delay(1000, token);
}
Console.WriteLine("Tâche terminée !");
}
}
Résultat:
Ce code affichera les messages de progression jusqu'à ce que la tâche soit annulée après 5 secondes. L'exception OperationCanceledException
sera levée et la tâche sera marquée comme annulée.
Conclusion
CancellationToken
est un outil essentiel pour gérer les annulations de tâches asynchrones en .NET. Il offre un moyen élégant et efficace de répondre aux interruptions et aux changements de contexte, améliorant ainsi la fiabilité et la réactivité de vos applications. N'oubliez pas d'utiliser CancellationToken
pour tous les processus asynchrones qui peuvent être interrompus, et de gérer les exceptions d'annulation pour garantir un traitement adéquat.