线程嵌套指的是:线程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,………..
多线程慎用。。。