1、Abort当前线程,后续程序不会执行

class Program
{
public static Thread thread1; static void Main(string[] args)
{
thread1 = new Thread(Method1);
thread1.Start();
Console.ReadKey();
}
public static void Method1()
{
try
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Mthod1: " + i.ToString());
Thread.Sleep(1000);
if (i == 3)
{
Thread.CurrentThread.Abort(); // 抛出的ThreadAbortException异常
}
Console.WriteLine("Mthod1: " + i.ToString() + " End");
}
}
catch (SocketException ex)
{
Console.WriteLine("Method1 SocketException: " + ex.ToString());
}
catch (ThreadAbortException ex)
{
// ThreadAbortException要在Exception的前面,因为Exception能够匹配所有异常
Console.WriteLine("Method1 ThreadAbortException: " + ex.ToString());
}
catch (Exception ex)
{
Console.WriteLine("Method1 Exception: " + ex.ToString());
}
finally
{
Console.WriteLine("Method1 Finally:");
}
} }

执行结果:

1、thread1.Abort()执行后会直接抛出ThreadAbortException异常。

2、异常会停止后续所有程序的执行(没有输出"Method1: 3 End")。

3、catch语句会执行。catch (Exception ex)和catch (ThreadAbortException ex)都可以捕获异常,由于Exception可以匹配所有异常,因此catch (ThreadAbortException ex)应该在catch (Exception ex)的前面使用,所以输出了“"Method1 ThreadAbortException”。

4、finally语句会执行。

2、Abort当前线程,进行try catch捕获异常

class Program
{
public static Thread thread1; static void Main(string[] args)
{
thread1 = new Thread(Method1);
thread1.Start();
Console.ReadKey();
} public static void StopMethod1()
{
try
{
thread1.Abort(); // 首先捕获抛出的ThreadAbortException异常
}
catch (Exception ex)
{
Console.WriteLine("StopMethod1: " + ex.ToString());
}
}
public static void Method1()
{
try
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Mthod1: " + i.ToString());
Thread.Sleep(1000);
if (i == 5) StopMethod1(); // 再次捕获抛出的ThreadAbortException异常
}
}
catch (Exception ex)
{
Console.WriteLine("Method1: " + ex.ToString());
}
}
}

运行结果:

try catch{} 捕获两次抛出的ThreadAbortException。

2、Abort当前线程,不进行try catch捕获异常

class Program
{
public static Thread thread1; static void Main(string[] args)
{
thread1 = new Thread(Method1);
thread1.Start();
Console.ReadKey();
} public static void StopMethod1()
{
thread1.Abort();
}
public static void Method1()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Mthod1: " + i.ToString());
Thread.Sleep(1000);
if (i == 5) StopMethod1();
}
}
}

运行结果:

1、虽然线程抛出了ThreadAbortException异常,由于线程中没有使用try catch的语句捕获异常,所以看上去线程很平静的退出了。

2、而且,由于是在线程中抛出的异常,所以主进程没有任何错误提示。

3、for循环只输出到5,Abort()后一般线程会直接停止。

3、在一个线程中Abort另一个线程

class Program
{
public static Thread thread1;
public static Thread thread2; static void Main(string[] args)
{
thread1 = new Thread(Method1);
thread2 = new Thread(Method2);
thread1.Start();
thread2.Start();
Console.ReadKey();
} public static void StopMethod1()
{
try
{
thread2.Abort();
}
catch (Exception ex)
{
Console.WriteLine("StopMethod1: " + ex.ToString());
}
}
public static void Method1()
{
try
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Method1: " + i.ToString());
Thread.Sleep(1000);
if (i == 5) StopMethod1();
}
}
catch (Exception ex)
{
Console.WriteLine("Method3: " + ex.ToString());
}
}
public static void Method2()
{
try
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Method2: " + i.ToString());
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
Console.WriteLine("Method2: " + ex.ToString());
}
}
}

运行结果:

1、可以看到只在thread2中捕获到了ThreadAbortException异常。

2、thread1完整的运行完毕了,并且没有ThreadAbortException异常抛出。

总结

1、theadX.Abort()方法会在线程X中抛出ThreadAbortException异常,线程X中所有正在执行的try catch都会捕获该异常。

2、theadX.Abort()有可能在Y线程中调用的,不会在Y线程中抛出ThreadAbortException异常。

C# Thread.Abort方法与ThreadAbortException异常(取消线程与异常处理)的更多相关文章

  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. Thread.Abort 方法

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

  5. 线程的Abort方法有感

    今天看CSDN上一个很老的帖子,有个人说Thread.Abort()方法调用之后一定会抛出异常,我对这个有点疑问. 于是自己做了一个测试demo,来研究Abort抛出异常的时机.废话少说,直接上代码: ...

  6. JAVA下的Thread.sleep方法一定要try

    try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } 不同于C#,JAVA里的Thre ...

  7. 注意Thread.interrupt()方法的真正作用并不是用来中断线程

      程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.      在本篇文章中,我们针对这些难题之一:如何中断一个正在 ...

  8. Linux学习笔记23——取消线程

    一 相关函数 1 发送终止信号 #include <pthread.h> int pthread_cancel(pthread_t thread); 2 设置取消状态 #include & ...

  9. Thread.Sleep引发ThreadAbortException异常

    短信平台记录日志模块,是通过异步方式来记录的,即日志工具类里初始化一个Queue对象,公共的写日志方法的处理逻辑是把日志消息放到Queue里.构造器里设定一个死循环,不停的读队,然后把日志消息持久化到 ...

随机推荐

  1. 聊聊springboot2的embeded container的配置改动

    本文主要研究下springboot2的embeded container的配置改动 springboot 1.x import org.apache.catalina.connector.Connec ...

  2. RFC的远程调用-异步

    接上篇RFC的远程调用-同步(https://www.cnblogs.com/BruceKing/p/11169930.html). TABLES:USR21. DATA:A TYPE USR21-P ...

  3. QT+OpenGL(01)--实现三角形渲染

    1.openglwidget.ui <ui version="4.0"> <author/> <comment/> <exportmacr ...

  4. IIS创建文件服务器(WebDAV)

    1.安装IIS,选择安装WEBDAV组件.然后新建站点,站点目录不需要额外设置任何权限 安装完成后组件: 2.配置WebDAV: 添加创作规则:允许某用户写入,其他所有用户读取.(写入规则必须要放在第 ...

  5. ASP.NET Core系列:中间件

    1. 概述 ASP.NET Core中的中间件是嵌入到应用管道中用于处理请求和响应的一段代码. 2. 使用 IApplicationBuilder 创建中间件管道 2.1 匿名函数 使用Run, Ma ...

  6. 删除Win10远程桌面中的无用的IP列表

    运行中,输入regedit,然后找到这个位置(也可在任务管理器的地址栏中,直接输入下面的地址),便可删除远程桌面中列出的一些无用的IP地址. 计算机\HKEY_CURRENT_USER\Softwar ...

  7. git did not exit cleanly (exit code 1) 的解决办法

    问题描述: 关于Git的使用,在通常情况下,习惯于先在本地创建一个本地仓库,然后将项目提交到本地master,再将本地master中的项目Push 到远程仓库中,这样问题就来了. 具体错误信息如下: ...

  8. 通过MES技术居然可以防止制造数据造假?

    近些年来我们经历了太多制造数据造假事件,特别是前段时间曝出的医药制造事件更是将我们群众的愤怒值推到了最高点.不过我们最应当做的是,冷静下来,思考一下各行各业的我们是不是都该做些什么了?毕竟当下一个灾难 ...

  9. 基本运算符,流程控制if、while

    基本运算符 算术运算符 运算符 描述 实例 + 加 a + b - 减 a - b * 乘 a * b / 除 a / b % 取余 a % b // 整除 a // b ** 幂运算 a ** b ...

  10. Linux(Centos7)搭建LAMP(Apache+PHP+Mysql环境)

    目录 Linux搭建LAMP(Apache+PHP+Mysql环境)Centos7 一. 检查系统环境 1.确认centos版本 2.检查是否安装过apache 3.检查是否安装过Mysql 4.清理 ...