[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)] 
 public void Abort()  
在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。

在线程上调用此方法时,系统在线程中引发 ThreadAbortException 以中止它。 ThreadAbortException 是一个可以由应用程序代码捕获的特殊异常,但除非调用 ResetAbort,否则会在 catch 块的结尾再次引发它。ResetAbort 取消中止请求,并防止 ThreadAbortException 终止该线程。未执行的 finally 块将在线程终止前执行。

备注:

1、如果对尚未启动的线程调用 Abort,则当调用 Start 时该线程将中止。如果对被阻止或正在休眠的线程调用 Abort,则该线程被中断然后中止。

2、如果在已挂起的线程上调用 Abort,则将在调用 Abort 的线程中引发 ThreadStateException,并将 AbortRequested 添加到被中止的线程的 ThreadState 属性中。 直到调用 Resume 后,才在挂起的线程中引发 ThreadAbortException

3、如果在正在执行非托管代码的托管线程上调用 Abort,则直到线程返回到托管代码才引发 ThreadAbortException。

4、如果同时出现两次对 Abort 的调用,则可能一个调用设置状态信息,而另一个调用执行 Abort。但是,应用程序无法检测到此情况。

5、对线程调用了 Abort 后,线程状态包括 AbortRequested。 成功调用 Abort 而使线程终止后,线程状态更改为 Stopped。如果有足够的权限,作为 Abort 目标的线程就可以使用 ResetAbort 方法取消中止操作。有关说明如何调用 ResetAbort 方法的示例,请参见 ThreadAbortException 类。

using System;
using System.Threading;
using
System.Security.Permissions;

public class ThreadWork {
    public static void
DoWork()
    {
        try
        {
            for (int i = 0; i
< 100; i++)
            {
                Console.WriteLine("Thread -
working.");
                Thread.Sleep(100);
            }
       
}
        catch (ThreadAbortException e)
        {
           
Console.WriteLine("Thread - caught ThreadAbortException -
resetting.");
            Console.WriteLine("Thread.state:{0}",
Thread.CurrentThread.ThreadState.ToString());
           
Console.WriteLine("Exception message: {0}", e.Message);
           
Thread.ResetAbort();

//如果注释掉
Thread.ResetAbort();  fianlly中的代码仍会执行,但try catch
finally之后的代码不会被执行.而后跳转到调用abort()的函数中(这里为主函数)

}
        finally
        {
        
Console.WriteLine("Thread in
finally.Thread.state:{0}",Thread.CurrentThread.ThreadState.ToString());

}

//如果运行 
Thread.ResetAbort();  以下代码仍会执行,而后跳转到调用abort()的函数中(这里为主函数)
       
Console.WriteLine("Thread - still alive and working.");

Console.WriteLine("Thread.state:{0}",
Thread.CurrentThread.ThreadState.ToString());
       
Thread.Sleep(1000);
        Console.WriteLine("Thread - finished
working.");
    }
}

class ThreadAbortTest
{
    public static void
Main()
    {
        ThreadStart myThreadDelegate = new
ThreadStart(ThreadWork.DoWork);
        Thread myThread = new
Thread(myThreadDelegate);
        myThread.Start();
       
Thread.Sleep(100);
        Console.WriteLine("Main - aborting my
thread.");
        myThread.Abort();
        myThread.Join();
       
Console.WriteLine("Thread.state:{0}",
myThread.ThreadState.ToString());
        Console.Read();

}
}

public void Abort(Object stateInfo)

在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程。

并提供有关线程终止的异常信息的过程。调用此方法通常会终止线程。

using System;
using System.Threading;

class Test
{
    public static void
Main()
    {
        Thread newThread = new Thread(new
ThreadStart(TestMethod));
        newThread.Start();
       
Thread.Sleep(1000);

// Abort newThread.
       
Console.WriteLine("Main aborting new thread.");
       
newThread.Abort("Information from Main.");

//中止线程,并提供object类型的有关中止的信息。

// Wait for the thread to
terminate.
        newThread.Join();
        Console.WriteLine("New thread
terminated - Main exiting.");
        Console.Read();
    }

static void TestMethod()
    {
       
try
        {
            while (true)
            {
               
Console.WriteLine("New thread running.");
               
Thread.Sleep(1000);
            }
        }
        catch
(ThreadAbortException abortException)
        {
           
Console.WriteLine((string)abortException.ExceptionState);

//abortException.ExceptionState 
获取额外的中止信息。
        }
    }
}

Thread.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. 线程的Abort方法有感

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

  6. C# Thread.Join();Thread.Abort();

    Join() 等待当前线程运行完成后,才继续执行主线程后续代码: Abort() 结束当前线程,继续执行主线程后续代码: Thread.Join(); static void Main(string[ ...

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

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

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

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

  9. 多线程.Thread.Sleep方法

    多线程执行中,调用Thread.Sleep()方法 分情况: 1. 单核的情况下 是把当前正在工作的主线程停止(也就是从把线程变成非工作线程). 其他需要工作的线程来争夺CPU这个闲下来的核.谁争夺到 ...

随机推荐

  1. oracle 根据一个表更新另一个表内容

    declarecursor c_col is select * from xtgl_jgmcbm where substr(v_jgbm,0,2)in('41');--v_sjbm in( selec ...

  2. django学习系列——python和php对比

    python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...

  3. 设置eclipse联想功能

    当我们在用eclipse的时候,怎么能够让自己的编码速度加快?我想利用eclipse的提示功能是其中的方法之一.下面就利出配置eclipse联想功能(代码的提示功能)的步骤: 1. 打开Eclipse ...

  4. 《贝贝GO》隐私政策

    隐私政策 贝贝GO尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,贝贝GO会按照本隐私权政策的规定使用和披露您的个人信息.但贝贝GO将以高度的勤勉.审慎义务对待这些信息. ...

  5. 常见的CSS

    /***** Selector Hacks ******/ /* IE6 and below */ * html #uno { color: red } /* IE7 */ *:first-child ...

  6. Linux环境下nginx集群搭建

    #确保安装nginx,stream模块默认不安装的,需要手动添加参数:–with-stream, nginx1.9或以上版本 #nginx.conf文件中,添加以下内容(只供参考),这个不能放在htt ...

  7. 部署在sae上的servlet程序出现is not a javax.servlet.Servlet 错误

    sae本身提供了servlet jar包, 部署时删掉你lib目录下的servlet jar包.

  8. Restful下的token认证方案

    Restful讲究一个无状态的特性(stateless),这就不能把一些例如登陆后的认证信息写进cookie的传统方式, 目前探索的是采用token的方式来进行权限的识别. 刚开始研究token的时候 ...

  9. CCF-CIDR合并-201812-3

    看着很长的一道题目,其实还可以...但我只有90分...可能有些细节没有注意到...难受! 思路: 数据结构: string str ;  存储32位01串 int  len: 前缀长度 首先将输入的 ...

  10. mybatis 学习笔记 -详解mybatis 及实例demo

    快速入门1 要点: 首先明白mybatis 是什么 这是一个持久层的框架.之前叫做ibatis.所以,在它的代码中出现ibatis这个词的时候,不要感到惊讶.不是写错了,它确实就是这个样子的. 首先, ...