Maison >développement back-end >C++ >Comment puis-je arrêter correctement une tâche lors d'annulation en C #?

Comment puis-je arrêter correctement une tâche lors d'annulation en C #?

DDD
DDDoriginal
2025-01-26 12:36:10679parcourir

How Can I Properly Stop a Task Upon Cancellation in C#?

Gestion de l'annulation efficace des tâches en C #

La méthode CancellationToken.CancelNotification seule n'arrête pas une tâche d'exécution; Il signale simplement l'annulation. Pour vous assurer qu'une tâche se termine proprement lors de l'annulation, vous devez intégrer activement la manipulation d'annulation dans la logique de la tâche.

Tiration du motif asynchrone basé sur les tâches (TAP)

L'approche la plus efficace consiste à utiliser TAP et le CancellationToken cohérente:

  • passer CancellationToken: Incorporer un paramètre CancellationToken dans chaque méthode capable d'être annulée.
  • Vérification d'annulation régulière: Dans ces méthodes, vérifiez périodiquement l'état du jeton à l'aide de cancellationToken.ThrowIfCancellationRequested(). Si l'annulation est détectée, lancez une exception pour arrêter l'exécution.

Exemple de code révisé avec Tap

Cet exemple amélioré montre une bonne manipulation d'annulation:

<code class="language-csharp">private async Task TryTask()
{
    using (var source = new CancellationTokenSource())
    {
        source.CancelAfter(TimeSpan.FromSeconds(1));
        try
        {
            Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token);
            int result = await task; // Await will re-throw any exceptions.
            Console.WriteLine($"Task completed successfully: {result}");
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("Task cancelled successfully.");
        }
    }
}

private int slowFunc(int a, int b, CancellationToken cancellationToken)
{
    for (int i = 0; i < 1000000; i++)
    {
        cancellationToken.ThrowIfCancellationRequested(); // Check for cancellation
        // ... your long-running operation ...
    }
    return a + b;
}</code>

Explication:

  • using Déclaration: s'assure que le CancellationTokenSource est correctement éliminé, même si des exceptions se produisent.
  • try-catch Bloc: gère le OperationCanceledException lancé par cancellationToken.ThrowIfCancellationRequested(), offrant une manipulation de l'annulation propre.
  • slowFunc: L'appel cancellationToken.ThrowIfCancellationRequested() est stratégiquement placé dans la boucle, permettant des vérifications d'annulation fréquentes. Cela empêche le travail inutile après l'annulation demandée.

Cette approche révisée garantit que la tâche s'arrêtera rapidement lorsque l'annulation sera demandée, empêchant les fuites de ressources et améliore la réactivité globale de l'application.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn