Maison >développement back-end >C++ >Comment interrompre en toute sécurité les tâches de longue durée dans .NET sans utiliser Thread.Abort() ?

Comment interrompre en toute sécurité les tâches de longue durée dans .NET sans utiliser Thread.Abort() ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-20 01:07:091013parcourir

How to Safely Interrupt Long-Running Tasks in .NET Without Using Thread.Abort()?

Arrêter en toute sécurité les tâches .NET : alternatives à Thread.Abort()

Contrairement aux threads, qui peuvent être arrêtés de force avec Thread.Abort(), les tâches dans .NET 4.0 et versions ultérieures n'ont pas d'équivalent direct pour une interruption immédiate. Bien que les jetons d'annulation offrent une stratégie de sortie gracieuse, certaines situations nécessitent une interruption immédiate des tâches.

Scénarios exigeant l'arrêt immédiat des tâches

Considérons une application Windows Forms effectuant le blocage des appels de service Web synchrones dans une boucle parallèle :

<code class="language-csharp">CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;

Parallel.ForEach(iListOfItems, po, (item, loopState) =>
{
    Thread.Sleep(120000); // Simulates a web service call
});</code>

Si l'utilisateur ferme l'application en cours de processus, les threads de la boucle parallèle continuent de s'exécuter, ce qui peut entraîner des retards et le blocage de l'application.

Au-delà des jetons d'annulation

Les jetons d'annulation sont idéaux pour une résiliation en douceur, mais ils sont moins efficaces pour bloquer les appels. Une solution plus robuste implique un indicateur booléen, stopExecuting, vérifié dans la boucle de tâches pour signaler un arrêt immédiat :

<code class="language-csharp">bool stopExecuting;

Parallel.ForEach(iListOfItems, po, (item, loopState) =>
{
    if (stopExecuting)
    {
        loopState.Stop();
        return;
    }
    // Task execution code
});</code>

Le réglage de stopExecuting sur true lorsque l'utilisateur ferme le formulaire arrête toutes les tâches en cours. Cependant, cela n’élimine pas les retards dus aux appels bloquants déjà en cours.

Thread.Abort() – Un dernier recours

Thread.Abort() peut être utilisé sur les threads générés par la boucle parallèle en dernier recours, mais cela est fortement déconseillé en raison de l'instabilité potentielle du système.

L'utilisation d'un indicateur partagé thread-safe et l'évitement des jetons d'annulation pour une résiliation immédiate offrent une approche plus sûre et plus gérable pour les scénarios nécessitant une interruption rapide des tâches.

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