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
Libérer: 2025-01-20 01:07:09
original
997 Les gens l'ont consulté

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

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal