Annuler des tâches asynchrones avec Task.Run et CancellationToken
Le framework .NET fournit un mécanisme puissant pour gérer les tâches asynchrones, notamment à travers la classe Task.Run
et l'utilisation des CancellationToken
. Ces outils sont essentiels pour une gestion efficace des tâches longues et pour la possibilité de les interrompre à la demande.
Comprendre les CancellationToken
Un CancellationToken
est un objet qui représente un signal d'annulation. Il permet à un code de vérifier si une opération doit être interrompue. Lorsqu'un CancellationToken
est annulé, tous les objets qui lui sont associés reçoivent un signal d'arrêt.
Utiliser Task.Run avec CancellationToken
La méthode Task.Run
est idéale pour exécuter des tâches longues dans un thread distinct. Elle permet d'éviter de bloquer le thread principal et d'améliorer la réactivité de l'application. En intégrant un CancellationToken
à l'appel de Task.Run
, vous pouvez contrôler l'exécution de la tâche et la terminer si nécessaire.
using System.Threading;
using System.Threading.Tasks;
// Créer un CancellationTokenSource
CancellationTokenSource cts = new CancellationTokenSource();
// Créer une tâche avec Task.Run et un CancellationToken
Task task = Task.Run(() => {
// Vérifier l'état du CancellationToken à intervalles réguliers
while (!cts.Token.IsCancellationRequested)
{
// Exécuter le code de la tâche
// ...
// Simuler un délai
Thread.Sleep(1000);
}
}, cts.Token);
// Attendre la fin de la tâche, avec un timeout éventuel
try
{
// Annuler la tâche après 5 secondes
await Task.WhenAny(task, Task.Delay(5000));
// Si la tâche n'est pas terminée, l'annuler
if (!task.IsCompleted)
{
cts.Cancel();
// Gérer l'annulation éventuelle
// ...
}
// Attendre la fin de la tâche
await task;
}
catch (OperationCanceledException)
{
// Gérer l'exception d'annulation
// ...
}
Explication du code :
- Création d'un
CancellationTokenSource
: UnCancellationTokenSource
est nécessaire pour créer unCancellationToken
et gérer son annulation. - Démarrage de la tâche avec
Task.Run
: La méthodeTask.Run
exécute le code de la tâche dans un thread séparé. LeCancellationToken
est passé en paramètre. - Vérification de l'état du
CancellationToken
: Le code de la tâche vérifie l'état duCancellationToken
à l'aide de la propriétéIsCancellationRequested
. Si la propriété esttrue
, la tâche est annulée. - Annulation de la tâche: Le code principal appelle la méthode
Cancel()
duCancellationTokenSource
. Cela annule leCancellationToken
associé et interrompt la tâche. - Gestion des exceptions: En cas d'annulation, une exception
OperationCanceledException
est levée. Vous devez gérer cette exception pour gérer l'annulation de manière appropriée.
Avantages de l'utilisation de CancellationToken
- Contrôle de la durée d'exécution: Vous pouvez annuler des tâches longues si elles ne sont plus nécessaires.
- Réactivité de l'application: L'application reste réactive même si des tâches longues sont en cours d'exécution.
- Gestion des ressources: L'annulation permet de libérer les ressources utilisées par les tâches qui ne sont plus nécessaires.
En conclusion, l'utilisation de Task.Run
et CancellationToken
est essentielle pour une gestion efficace des tâches asynchrones dans .NET. Ils permettent de contrôler l'exécution des tâches, d'interrompre les opérations inutiles et d'améliorer la réactivité et la fiabilité des applications.