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,………..
多线程慎用。。。
C#多线程 线程嵌套调用问题的更多相关文章
- 多线程-Thread、Runnable 创建线程和调用过程分析
创建线程的两种方式: 1:创建Thread类的子类 ---基于继承的技术 . 2:以Runnable接口实例为构造参数直接通过new 创建 Thread 实例.---基于组合的技术. public ...
- [C#学习]在多线程中如何调用Winform[转]
问题的产生: 我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉.请问如 ...
- 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),
1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...
- C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- java多线程-线程池
线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等. 我们可以把并发执行的任务传递给一个线程池, ...
- 如何:对 Windows 窗体控件进行线程安全调用
http://msdn.microsoft.com/zh-cn/library/ms171728(VS.90).aspx http://msdn.microsoft.com/zh-cn/library ...
- java多线程-线程通信
线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...
- 在线程中调用SaveFileDialog
在多线程编程中,有时候可能需要在单独线程中执行某些操作.例如,调用SaveFileDialog类保存文件.首先,我们在Main方法中创建了一个新线程,并将其指向要执行的委托SaveFileAsyn.在 ...
- java 多线程—— 线程让步
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
随机推荐
- hive JDBC异常到多租户
hive jdbc执行select count(*) from test报错. return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedT ...
- Spring 与 @Resource注解
Spring 中支持@Autowired注解,能够实现bean的注入.同时,Spring 也支持@Resource注解,它和@Autowired类似,都是实现bean的注入.该注解存在javax.an ...
- hihoCoder1304:24点
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho都在家待着. 在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间. 小Ho:玩 ...
- iphone配置实用工具iPhone Configuration Utility
下载地址 http://support.apple.com/kb/DL1466 安装完毕后,在设备->控制台,可以很方便看到报错信息
- C Primer Plus学习笔记(八)- 函数
函数简介 函数(function)是完成特定任务的独立程序代码单元 使用函数可以省去编写重复代码的苦差,函数能让程序更加模块化,提高程序代码的可读性,更方便后期修改.完善 #include <s ...
- 谈谈开发文本转URL小工具的思路
URL提供了一种定位互联网上任意资源的手段,由于采用HTTP协议的URL能在互联网上自由传播和使用,所以能大行其道.在软件开发.测试甚至部署的环节,URL几乎可以说无处不再,其中用来定位文本的URL数 ...
- 一次Mono解析Excel文档编码出错排查记录
最近在捯饬Asp.Net站点部署到Linux平台上面,在文档导入的操作中经过网上搜索采用了能够支持跨平台的ExcelDataReader组建.在本地windows上测试通过NuGet安装的组建,这货依 ...
- Java was started but returned exit code=13 问题解决
我在安装完jdk后,也对环境进行了配置,且环境的配置是没有问题的.最后我下载了eclipse,然后打开之后就发现了以下图所示的错误: Java was started but returned exi ...
- 如何在Eclipse下查看JDK源代码以及java源代码阅读方法(转载)
不会看JDK源代码,相当于没学过Java. 网上不容易找到一篇帮助我解决了如何在Eclipse下查看JDK源代码 的文章. 核心提示:在Eclipse中查看JDK类库的源代码!!! 设置: 1.点 w ...
- 我积累的Java实用代码
1.解压zip文件 /** * 解压输入的zip流,Java默认的解压只能处理UTF-8编码的文件或者目录名,否则会报MALFORMED异常 * * @param is 输入流 * @param ou ...