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

    多线程慎用。。。

  • 相关阅读:
    Discuz论坛自动发帖机
    C#测试数据库连接是否成功
    JS重写提示框(confirm)
    随笔 选择
    随笔 诚实
    web项目经理手册【1】版本控制流程
    Asp.net多层架构中的变量引用与传递
    ASP.NET跨页面传值技巧总结
    web项目经理手册【3】Code Review
    web项目经理手册【7】项目经理需要铭记在心的话
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9877236.html
Copyright © 2011-2022 走看看