Sobes.tech
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.

  1. Créer un CancellationTokenSource.
  2. Obtenir un CancellationToken à partir du CancellationTokenSource.
  3. Passer le CancellationToken à une méthode qui exécute la tâche.
  4. À l'intérieur de la méthode en cours d'exécution, vérifier périodiquement la propriété IsCancellationRequested du token.
  5. Si IsCancellationRequested est true, générer une OperationCanceledException ou appliquer une autre logique de terminaison.
  6. Pour demander l'annulation, appeler la méthode Cancel() sur l'objet CancellationTokenSource.

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.