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. LeetCode Contest 166

    LeetCode Contest 166 第一次知道LeetCode 也有比赛. 很久没有打过这种线上的比赛,很激动. 直接写题解吧 第一题 很弱智 class Solution { public: ...

  2. 【maven】【IDEA】idea中使用maven编译项目,报错java: 错误: 找不到符号 【2】

    =================================================================================== idea中使用maven编译项目 ...

  3. 01_python基础(一)

    python学习笔记,打算用五章介绍完python基础语法及基本用法. 开发环境: python3.7    推荐:  https://github.com/jackfrued/Python-100- ...

  4. Server2016 IIS安装配置

  5. python网络编程-2

    1.理解相关概念 #浅显理解下 对比cpu与io的差距如:io从硬盘读取一条数据9ms ,cpu在9ms可以做450万次指令 cpu切换上下文的方式:1.遇到io操作切换cpu 2.cpu时间片分配 ...

  6. Innodb整体架构

    如下图展示了Innodb内存中和磁盘的结构: 内存中结构主要有如下几种: buffer pool change buffer adaptive hash index (自适应的hash索引) Log ...

  7. Linux进程管理 (篇外)内核线程简要介绍【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8336998.html 关键词:kthread.irq.ksoftirqd.kworker.workqueues 在使用p ...

  8. linux设备驱动程序-设备树(1)-dtb转换成device_node

    linux设备驱动程序-设备树(1)-dtb转换成device_node 本设备树解析基于arm平台 从start_kernel开始 linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂 ...

  9. LightGBM调参笔记

    本文链接:https://blog.csdn.net/u012735708/article/details/837497031. 概述在竞赛题中,我们知道XGBoost算法非常热门,是很多的比赛的大杀 ...

  10. UE4 C++中出现的让人手足无措的问题(持续更新)

    最近开始涉入UE4更深层的一面——UE4 C++,由于其中的体系和在课本或者是网课上那么说的C++体系有一些误差(准确说就是遵循的C++标准不同),导致学习与运用起来有些吃力,所以作此总结,为自己的开 ...