Jetons d’annulation
Contexte : Les jetons d’annulation fournissent un moyen standard d’annuler des opérations asynchrones. Ils sont coopératifs : l’opération doit vérifier périodiquement le jeton et réagir.
Exemple complet
Section intitulée « Exemple complet »using System;using System.Threading;using System.Threading.Tasks;
public class Program{ public static async Task Main() { using var cts = new CancellationTokenSource();
// Délai d’expiration de 3 secondes cts.CancelAfter(3000);
Console.WriteLine("Démarrage d’une longue opération. Appuyez sur 'c' pour annuler, ou attendez le délai.");
// Démarrer une tâche pour écouter une touche _ = Task.Run(() => { if (Console.ReadKey(true).KeyChar == 'c') { Console.WriteLine("\nAnnulation manuelle demandée."); cts.Cancel(); } });
try { await LongRunningOperationAsync(cts.Token); Console.WriteLine("Opération terminée avec succès."); } catch (OperationCanceledException) { Console.WriteLine("Opération annulée."); } }
static async Task LongRunningOperationAsync(CancellationToken token) { for (int i = 0; i < 100; i++) { // Vérifier l’annulation à chaque itération token.ThrowIfCancellationRequested();
Console.WriteLine($"Étape {i + 1}/100"); await Task.Delay(200, token); // Passer le jeton à Delay également } }}Explication
Section intitulée « Explication »CancellationTokenSourcecrée un jeton et peut demander l’annulation.CancelAfter(3000)annule automatiquement après 3 secondes.- La boucle vérifie
token.ThrowIfCancellationRequested(); si annulé, uneOperationCanceledExceptionest levée. Task.Delayaccepte aussi un jeton, permettant de l’annuler pendant l’attente.- L’annulation manuelle est déclenchée en appuyant sur ‘c’.