线程的Abort方法有感
今天看CSDN上一个很老的帖子,有个人说Thread.Abort()方法调用之后一定会抛出异常,我对这个有点疑问。
于是自己做了一个测试demo,来研究Abort抛出异常的时机。废话少说,直接上代码:
static void Main(string[] args)
{
Thread th = new Thread(Worker);
th.Start();
Thread.Sleep();
try
{
Console.WriteLine(th.ThreadState+","+th.IsAlive); th.Abort();
Console.WriteLine(th.ThreadState);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + ",");
}
th.Join();
Console.WriteLine("子线程被正常终止,没有抛出异常");
Console.WriteLine("主线程结束");
Console.Read();
}
private static void Worker()
{
try
{
for (int i = ; i < ; i++)
{
Console.WriteLine(i);
Thread.Sleep();
}
}
catch (Exception ex)
{
Console.WriteLine(e.GetType().Name);
Console.WriteLine("Abort抛出异常");
}
finally
{
Console.WriteLine("{0} Status is:{1} In Abort Thread", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);
}
}
上面这段代码,我在子线程的循环体中加入了Thread.Sleep()方法,以便让主线程能够在子线程执行完毕之前执行Abort方法,这个时候,调用Abort方法,子线程中会抛出异常。
当我把Thread.sleep(100)这句话注释掉之后,会发现调用Abort方法之后,子线程中不会抛出异常。
所以我们由此可以得出结论,当子线程中的方法执行完毕之后,调用Abort不会出现异常,当子线程中的方法执行完毕之前,调用Abort方法的时候会抛出异常。
所以,我们在写多线程程序的时候,在Abort子线程时,一定要trycatch 捕获一下这个异常,以防程序出错。
线程的Abort方法有感的更多相关文章
- 注意!你的Thread.Abort方法真的让线程停止了吗?
大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Threa ...
- C# Thread.Abort方法真的让线程停止了吗?
大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Threa ...
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
EF Core使用SQL调用返回其他类型的查询 假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...
- C# Thread.Abort方法与ThreadAbortException异常(取消线程与异常处理)
1.Abort当前线程,后续程序不会执行 class Program { public static Thread thread1; static void Main(string[] args) { ...
- Thread.Abort 方法
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)] public void Abort() 在调用此方 ...
- Java中怎样创建线程安全的方法
面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? class MyCounter { private static int counter = 0; public static int ...
- WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...
- C#中的几个线程同步对象方法
在编写多线程程序时无可避免会遇到线程的同步问题.什么是线程的同步呢? 举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B(即工作线程)在早一些时候拿了这个变量的 ...
- 多线程---其他方法 停止线程、守护线程、join方法
第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到 ...
随机推荐
- Oracle转MySQL
1. to_date 直接去掉 例如 select log.id from CM_LOGINLOG log where log.orgid =? and log.isAuto =? and lo ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- psp进度(11月25号-31号)
本周psp进度 11月25号 内容 开始时间 结束时间 打断时间 净时间 处理数据集 9:27 11:34 12m 115m 11月27号 内容 开始时间 结束时间 打断时间 净时间 scr ...
- 1. Two Sum I & II & III
1. Given an array of integers, return indices of the two numbers such that they add up to a specific ...
- Objective-C( Foundation框架 一 NSDictionary (NSMutaleDictionary))
NSDictionary 不可变的字典 创建字典的方法 // 创建字典的方式 NSDictionary *dy = [NSDictionary dictionaryWithObject:@" ...
- guava学习--FutureCallback
转载:https://my.oschina.net/realfighter/blog/349929 Guava提供了 FutureCallback接口,FutureCallback接口提供了onSuc ...
- C# cmd执行命令
CMD命令执行 ///<summary> /// cmd命令执行,在cmd上可以执行的语句,直接传到这里,调用grads画图实例如下: /// Cmd(& ...
- swift 计算label的行数方法
这主要针对是 cell上label自适应高度, let lineSpaceKey = "lineSpaceKey" extension UILabel{ var lineSpace ...
- using border-radius to make a worker
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- Eclipse JUnit 生成报告
http://blog.sina.com.cn/s/blog_8af106960102v6qh.html 对Eclipse的工程写单元测试: 第一步: 1. 一个工程有多个测试类,将测试类放到一个测试 ...