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,………..

多线程慎用。。。

posted on 2018-10-30 15:45  asdyzh  阅读(1810)  评论(0编辑  收藏  举报

导航