• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#多线程线程嵌套调用问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

多线程慎用。。。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap