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!