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
Libérer: 2025-01-26 12:36:10
original
675 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal