今天看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方法有感的更多相关文章

  1. 注意!你的Thread.Abort方法真的让线程停止了吗?

    大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Threa ...

  2. C# Thread.Abort方法真的让线程停止了吗?

    大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Threa ...

  3. 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 中,执行该操作的另一种方法 ...

  4. C# Thread.Abort方法与ThreadAbortException异常(取消线程与异常处理)

    1.Abort当前线程,后续程序不会执行 class Program { public static Thread thread1; static void Main(string[] args) { ...

  5. Thread.Abort 方法

    [SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)] public void Abort() 在调用此方 ...

  6. Java中怎样创建线程安全的方法

    面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? class MyCounter { private static int counter = 0; public static int ...

  7. WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )

    WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...

  8. C#中的几个线程同步对象方法

    在编写多线程程序时无可避免会遇到线程的同步问题.什么是线程的同步呢? 举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B(即工作线程)在早一些时候拿了这个变量的 ...

  9. 多线程---其他方法 停止线程、守护线程、join方法

    第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到 ...

随机推荐

  1. 鼠标hover某个元素时其属性表现Css transition 过渡效果(以宽高属性居中放大为例)

    <!DOCTYPE html> <html> <head> </head> <body id="body"> <! ...

  2. 前端优化之图片延迟加载(lazyload.js)

    要想缩短首屏加载时间,思路一般是减少http请求次数和降低每次的请求量.本文中使用现成的lazyload.js插件,文末会放出下载地址. lazyload.js可以实现图片分批次加载,不是一次性加载完 ...

  3. Eclipse 安装中文插件

    从官网下载下来的Eclipse都是英文版,下载后解压,运行Eclipse. 地址:http://www.eclipse.org/babel/downloads.php .启动Eclipse,在菜单,“ ...

  4. 关于MySql has gone away问题的解决

    everybody 是否导入数据库的时候 导的导的 就会出现这个错误呢,这个错误的原因是你的数据库有点大,数据有点多,导入时间过长与服务器失去连接了,让我们看下咋解决把. 如果用的是xampp 修改m ...

  5. Visual Studio Code中文文档(一)-快速入门

    Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行.Visual Studio Code内置了对J ...

  6. 优化Android Studio/Gradle构建

     使用Android Studio进行开,随着项目的增大,依赖库的增多,构建速度越来越慢,现在最慢要6分钟才能build一个release的安装包,在网上查找资料,发现可以通过一些配置可以加快速度,这 ...

  7. POJ 3984 迷宫问题

    K - 迷宫问题 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  8. C# 正则表达式,提取字符串

    Regex.Match(n1,@"blog\.xxxx\.com/(.+)/blog_(\d+)\.html").Result("$2")

  9. LCM在Kernel中的代码分析

    lcm的分析首先是mtkfb.c 1.mtk_init中platform_driver_register(&mtkfb_driver)注册平台驱动 panelmaster_init(); DB ...

  10. css3过渡

    语法格式: transition:属性名 完成时间 速度曲线 何时开始 transition:width 2s ease-in 3s: width 2s 整个过渡效果持续的时间 ease-in 指定了 ...