zoukankan      html  css  js  c++  java
  • C#多线程 线程嵌套调用问题

    线程嵌套指的是:线程A的执行代码启动了线程B,线程B的执行代码又启动了线程C。

    我原本以为线程A被Abort后,线程B会自动被Abort,但是我大错特错了。

    在这种场景下,线程的管理就非常重要了。

    线程A被Abort后线程B是不会被他的父线程Abort的,除非你强制在线程A中Abort线程B。

    在线程A接收到Abort命令后(catch(ThreadAbortException)),Abort线程B即可。

    当然,如果你的需求不是在线程A被Abort后,不Abort线程B,那么也可以不Abort线程B,但是这样就放养了线程B,不受管制。

    下面是一个例子:

    t1启动线程t2,t2启动了t3.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace InnerThread
    {
        class Program
        {
            static void Main(string[] args)
            {
                Thread t1 = new Thread(new ThreadStart(DoWork1));
                t1.Name = "T1";
                t1.Start();
                Thread.Sleep(5000);
                t1.Abort();
                Console.ReadKey();
            }
    
            static void DoWork1()
            {
                Thread t2 = null;
                try
                {
                     t2 = new Thread(new ThreadStart(DoWork2));
                    t2.Name = "T2";
                    t2.Start();
                    while (true)
                    {
                        Console.WriteLine("t1 is working");
                        Thread.Sleep(500);
                    }
                }
                catch (ThreadAbortException)
                {
                    Console.WriteLine("t1 has been abort.");
                    t2.Abort();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            static void DoWork2()
            {
                Thread t3 = null;
                try
                {
                     t3 = new Thread(new ThreadStart(DoWork3));
                    t3.Name = "T3";
                    t3.Start();
                    while (true)
                    {
                        Console.WriteLine("t2 is working");
                        Thread.Sleep(500);
                    }
                }
                catch (ThreadAbortException)
                {
                    Console.WriteLine("t2 has been abort.");
                    t3.Abort();
                }
            }
            static void DoWork3()
            {
                try
                { 
                    while (true)
                    {
                        Console.WriteLine("t3 is working"); 
                    Thread.Sleep(500);
                    }
                }
                catch (ThreadAbortException)
                {
                    Console.WriteLine("t3 has been abort.");
                }
            }
        }
    }

    执行结果如下:

    当t1被Abort后,调用t2的Abort,t2被Abort,………..

    多线程慎用。。。

  • 相关阅读:
    ImportError: libXext.so.6: cannot open shared object file: No such file or directory
    Django项目添加日志
    Django项目DEBUG=False时配置静态文件
    Django项目DEBUG=False时配置静态文件
    真的佩服python强大表达力
    mycharm环境建立django项目并增删改查
    Apache配置https
    安卓签名
    Android studion不能启动问题
    带你入门函数式编程
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9877236.html
Copyright © 2011-2022 走看看