Maison > développement back-end > C++ > Comment puis-je annuler gracieusement des tâches dans un pool de threads au lieu d'utiliser Thread.Abort() ?

Comment puis-je annuler gracieusement des tâches dans un pool de threads au lieu d'utiliser Thread.Abort() ?

Linda Hamilton
Libérer: 2025-01-25 02:25:09
original
284 Les gens l'ont consulté

How Can I Gracefully Cancel Tasks in a Thread Pool Instead of Using Thread.Abort()?

Gestion élégante de l'annulation des tâches de thread

Dans les applications multithread, il est crucial de gérer et de terminer efficacement les tâches dans les threads. Dans ce cas, vous rencontrez un problème où .Abort() sur un thread ne parvient pas à terminer la tâche associée. Pour résoudre ce problème, explorons une approche recommandée : utiliser des balises d'annulation.

Comprendre les pools de threads et le comportement des tâches

Lorsque System.Threading.Tasks sont créés, ces tâches s'appuient sur des threads d'arrière-plan gérés par le pool de threads. L'utilisation de .Abort() pour annuler ces threads n'est pas recommandée en raison du risque de fuite de ressources et d'instabilité des applications.

Utiliser la marque d'annulation pour l'annulation de la tâche

Au lieu de compter sur .Abort(), utilisez le marquage d'annulation comme méthode de terminaison de tâche plus efficace et contrôlable. Voici comment cela fonctionne :

  • Créez un CancellationTokenSource et exposez sa propriété CancellationToken.
  • Lors de l'initialisation d'une tâche, transmettez le CancellationToken à son constructeur ou à sa méthode StartNew.
  • Dans la logique d'exécution de la tâche, vérifiez périodiquement si l'indicateur CancellationToken.IsCancellationRequested a été défini.
  • Terminez l'exécution en douceur et indiquez (par exemple, via la journalisation) si la demande a été annulée.

Exemple de mise en œuvre

L'exemple de code suivant montre comment utiliser la balise d'annulation :

<code class="language-csharp">class Program
{
    static void Main()
    {
        var cts = new CancellationTokenSource();
        CancellationToken ct = cts.Token;
        Task.Factory.StartNew(() =>
        {
            while (!ct.IsCancellationRequested)
            {
                // 执行工作
                Thread.Sleep(100);
            }
            // 处理取消
            Console.WriteLine("任务已取消");
        }, ct);

        // 模拟等待任务完成
        Thread.Sleep(3000);

        // 启动任务取消
        cts.Cancel();
        Console.ReadLine();
    }
}</code>
Copier après la connexion

Dans cet exemple, la tâche s'exécutera indéfiniment jusqu'à ce que la méthode CancellationTokenSource.Cancel() soit appelée, déclenchant la logique d'annulation dans la tâche et mettant fin à son exécution. Le code amélioré évite l'imbrication inutile des instructions if, rendant le code plus concis et plus lisible.

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