在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
线程嵌套指的是:线程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,……….. 多线程慎用。。。 |
请发表评论