Thread.Abort 方法

Posted luluping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thread.Abort 方法相关的知识,希望对你有一定的参考价值。

[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 方法的主要内容,如果未能解决你的问题,请参考以下文章

Thread.Abort 方法

Thread.Abort()方法冻结

.NET Thread.Abort 再次

c# .net 一条线程 abort 之后,怎么重启启动。

Thread.Abort() 并在 finally 之后延迟

Thread.Abort 的安全异常