Thread.Abort 方法

定义

ThreadAbortException 调用它的线程中引发 ,以开始终止线程的过程。 调用此方法通常会终止线程。

重载

Abort()
已过时.

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

Abort(Object)
已过时.

引发在其上调用的线程中的 ThreadAbortException 以开始处理终止线程,同时提供有关线程终止的异常信息。 调用此方法通常会终止线程。

注解

重要

Thread.Abort请谨慎使用 方法。 特别是当你调用它来中止当前线程以外的线程时,你不知道引发 时 ThreadAbortException 执行了哪些代码或执行了哪些代码失败。 你也不能确定应用程序的状态及其负责保留的任何应用程序和用户状态。 例如,调用 Thread.Abort 可能会阻止执行静态构造函数或释放托管或非托管资源。

Abort()

注意

Thread.Abort is not supported and throws PlatformNotSupportedException.

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

public:
 void Abort();
[System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public void Abort ();
public void Abort ();
[<System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
member this.Abort : unit -> unit
member this.Abort : unit -> unit
Public Sub Abort ()
属性

例外

仅限 .NET Core 和 .NET 5 及更高版本:在所有情况下。

调用方没有所要求的权限。

正在中止的线程当前已挂起。

注解

此方法已过时。 在 .NET 5 及更高版本上,调用此方法会生成编译时警告。 此方法在 .NET 5 及更高版本和 .NET Core 的运行时引发 PlatformNotSupportedException

在线程上调用此方法时,系统会在线程中引发 ThreadAbortException 以中止它。 ThreadAbortException 是一个特殊异常,应用程序代码可以捕获,但在块末尾 catch 重新引发,除非 ResetAbort 调用 。 ResetAbort 取消中止请求,并阻止 ThreadAbortException 终止线程。 未执行的 finally 块在线程中止之前执行。

注意

当线程调用 Abort 自身时,效果类似于引发异常; ThreadAbortException 立即发生,结果可预测。 但是,如果一个线程在另一个线程上调用 Abort ,则中止会中断正在运行的任何代码。 静态构造函数也有可能中止。 在极少数情况下,这可能会阻止在该应用程序域中创建该类的实例。

不保证线程立即中止或完全中止。 如果线程在作为中止过程的一部分调用的 finally 块中执行无限量的计算,从而无限期地延迟中止,则可能会出现这种情况。 若要等待线程中止,可以在调用 Join 方法后在线程上调用 Abort 方法,但不能保证等待将结束。

注意

如果被中止的线程位于代码的受保护区域(如catch块、finally块或受约束的执行区域),则调用Abort的线程可能会受阻。 如果调用 Abort 的线程持有中止的线程所需的锁,则可能发生死锁。

如果在 Abort 尚未启动的线程上调用 ,则调用 时 Start 线程将中止。 如果在 Abort 被阻止或处于睡眠状态的线程上调用 ,该线程将中断,然后中止。

如果在 Abort 已挂起的线程上调用 , ThreadStateException 则会在调用 Abort的线程中引发 ,并将其 AbortRequested 添加到 ThreadState 被中止的线程的 属性中。 在 ThreadAbortException 调用 之前 Resume ,不会在挂起的线程中引发 。

如果在 Abort 托管线程执行非托管代码时在托管线程上调用 , ThreadAbortException 则在线程返回到托管代码之前不会引发 。

如果同时发出对 的两个调用 Abort ,则一个调用可以设置状态信息,另一个调用可以执行 Abort。 但是,应用程序无法检测到这种情况。

在线程上调用 后 Abort ,线程的状态将包括 AbortRequested。 成功调用 Abort后,线程终止后,线程的状态将更改为 Stopped。 拥有足够的权限后,作为 目标的 Abort 线程可以使用 方法取消中止 ResetAbort 。 有关演示如何调用 ResetAbort 方法的示例,请参阅 ThreadAbortException 类。

另请参阅

适用于

Abort(Object)

注意

Thread.Abort is not supported and throws PlatformNotSupportedException.

引发在其上调用的线程中的 ThreadAbortException 以开始处理终止线程,同时提供有关线程终止的异常信息。 调用此方法通常会终止线程。

public:
 void Abort(System::Object ^ stateInfo);
[System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public void Abort (object? stateInfo);
public void Abort (object stateInfo);
public void Abort (object? stateInfo);
[<System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
member this.Abort : obj -> unit
member this.Abort : obj -> unit
Public Sub Abort (stateInfo As Object)

参数

stateInfo
Object

一个对象,它包含应用程序特定的信息(如状态),该信息可供正被中止的线程使用。

属性

例外

仅限 .NET Core 和 .NET 5 及更高版本:在所有情况下。

调用方没有所要求的权限。

正在中止的线程当前已挂起。

示例

下面的代码示例演示如何将信息传递给正在中止的线程。

using namespace System;
using namespace System::Threading;
ref class Test
{
private:
   Test(){}


public:
   static void TestMethod()
   {
      try
      {
         while ( true )
         {
            Console::WriteLine( "New thread running." );
            Thread::Sleep( 1000 );
         }
      }
      catch ( ThreadAbortException^ abortException ) 
      {
         Console::WriteLine( dynamic_cast<String^>(abortException->ExceptionState) );
      }

   }

};

int main()
{
   Thread^ newThread = gcnew Thread( gcnew ThreadStart( &Test::TestMethod ) );
   newThread->Start();
   Thread::Sleep( 1000 );
   
   // Abort newThread.
   Console::WriteLine( "Main aborting new thread." );
   newThread->Abort( "Information from main." );
   
   // Wait for the thread to terminate.
   newThread->Join();
   Console::WriteLine( "New thread terminated - main exiting." );
}
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.");

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

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

let testMethod () =
    try
        while true do
            printfn "New thread running."
            Thread.Sleep 1000
    with :? ThreadAbortException as abortException ->
        printfn $"{abortException.ExceptionState :?> string}"

let newThread = Thread testMethod
newThread.Start()
Thread.Sleep 1000

// Abort newThread.
printfn "Main aborting new thread."
newThread.Abort "Information from Main."

// Wait for the thread to terminate.
newThread.Join()
printfn "New thread terminated - Main exiting."
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim newThread As New Thread(AddressOf TestMethod)
        newThread.Start()
        Thread.Sleep(1000)

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

        ' Wait for the thread to terminate.
        newThread.Join()
        Console.WriteLine("New thread terminated - Main exiting.")
    End Sub

    Shared Sub TestMethod()
        Try
            While True
                Console.WriteLine("New thread running.")
                Thread.Sleep(1000)
            End While
        Catch abortException As ThreadAbortException
            Console.WriteLine( _
                CType(abortException.ExceptionState, String))
        End Try
    End Sub

End Class

注解

此方法已过时。 在 .NET 5 及更高版本上,调用此方法会生成编译时警告。 此方法在 .NET 5 及更高版本和 .NET Core 的运行时引发 PlatformNotSupportedException

在线程上调用此方法时,系统会在线程中引发 ThreadAbortException 以中止它。 ThreadAbortException 是一个特殊异常,应用程序代码可以捕获,但在块末尾 catch 重新引发,除非 ResetAbort 调用 。 ResetAbort 取消中止请求,并阻止 ThreadAbortException 终止线程。 未执行的 finally 块在线程中止之前执行。

注意

当线程调用 Abort 自身时,效果类似于引发异常; ThreadAbortException 立即发生,结果可预测。 但是,如果一个线程在另一个线程上调用 Abort ,则中止会中断正在运行的任何代码。 静态构造函数有可能中止。 在极少数情况下,这可能会阻止在该应用程序域中创建该类的实例。

不保证线程立即中止或完全中止。 如果线程在作为中止过程的一部分调用的 finally 块中执行无限量的计算,从而无限期地延迟中止,则可能会出现这种情况。 若要等待线程中止,可以在调用 Join 方法后在线程上调用 Abort 方法,但不能保证等待将结束。

注意

如果被中止的线程位于代码的受保护区域(如catch块、finally块或受约束的执行区域),则调用Abort的线程可能会受阻。 如果调用 Abort 的线程持有中止的线程所需的锁,则可能发生死锁。

如果在 Abort 尚未启动的线程上调用 ,则调用 时 Start 线程将中止。 如果在 Abort 被阻止或处于睡眠状态的线程上调用 ,该线程将中断,然后中止。

如果在 Abort 已挂起的线程上调用 , ThreadStateException 则会在调用 Abort的线程中引发 ,并将其 AbortRequested 添加到 ThreadState 被中止的线程的 属性中。 在 ThreadAbortException 调用 之前 Resume ,不会在挂起的线程中引发 。

如果在 Abort 托管线程执行非托管代码时在托管线程上调用 , ThreadAbortException 则在线程返回到托管代码之前不会引发 。

如果同时发出对 的两个调用 Abort ,则一个调用可以设置状态信息,另一个调用可以执行 Abort。 但是,应用程序无法检测到这种情况。

在线程上调用 后 Abort ,线程的状态将包括 AbortRequested。 成功调用 Abort后,线程终止后,线程的状态将更改为 Stopped。 拥有足够的权限后,作为 目标的 Abort 线程可以使用 方法取消中止 ResetAbort 。 有关演示如何调用 ResetAbort 方法的示例,请参阅 ThreadAbortException 类。

另请参阅

适用于