Thread.Abort 方法

定義

ThreadAbortException 叫用執行緒的 執行緒中引發 ,以開始終止執行緒的程式。 呼叫這個方法通常會結束執行緒。

多載

Abort()
已淘汰.

於被叫用的所在執行緒中引發 ThreadAbortException,開始處理執行緒的結束作業。 呼叫這個方法通常會結束執行緒。

Abort(Object)
已淘汰.

於被叫用的所在執行緒中引發 ThreadAbortException,開始結束執行緒的處理作業,同時也提供執行緒結束的相關例外狀況資訊。 呼叫這個方法通常會結束執行緒。

備註

重要

Thread.Abort請小心使用 方法。 特別是當您呼叫它來中止目前線程以外的執行緒時,您不知道擲回 時 ThreadAbortException ,哪些程式碼已執行或無法執行。 您也無法確定應用程式的狀態或任何應用程式及其負責保留的使用者狀態。 例如,呼叫 Thread.Abort 可能會防止執行靜態建構函式,或釋放 Managed 或 Unmanaged 資源。

Abort()

來源:
Thread.cs
來源:
Thread.cs
來源:
Thread.cs

警告

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是應用程式程式碼可攔截的特殊例外狀況,但除非 ResetAbort 呼叫,否則會在區塊結尾 catch 重新擲回。 ResetAbort 取消中止的要求,並防止 ThreadAbortException 終止執行緒。 在中止執行緒之前,會先執行未執行的 finally 區塊。

注意

當執行緒本身呼叫 Abort 時,效果類似于擲回例外狀況; ThreadAbortException 會立即發生,而且結果可預測。 不過,如果某個執行緒在另一個執行緒上呼叫 Abort ,中止會中斷任何正在執行的程式碼。 此外,也可能中止靜態建構函式。 在罕見的情況下,這可能會防止在該應用程式域中建立該類別的實例。

執行緒不保證會立即中止或完全中止。 如果執行緒在中止程式中呼叫的區塊中 finally 執行未系結的計算量,因而無限期地延遲中止,就會發生這種情況。 若要等候執行緒中止,您可以在呼叫 Abort 方法之後線上程上呼叫 Join 方法,但不保證等候將會結束。

注意

如果中止的執行緒位於程式碼的受保護區域中,例如 catch 區塊、 finally 區塊或限制執列區域,則呼叫 Abort 的執行緒可能會封鎖。 如果呼叫 Abort 的執行緒保留中止執行緒所需的鎖定,就會發生死結。

如果在 Abort 尚未啟動的執行緒上呼叫 ,則會在呼叫 時 Start 中止執行緒。 如果在 Abort 封鎖或睡眠的執行緒上呼叫 ,執行緒就會中斷,然後中止。

如果在 Abort 已暫停的執行緒上呼叫 , ThreadStateException 則會在呼叫 Abort 的執行緒中擲回 ,並將 AbortRequested 加入至 ThreadState 中止之執行緒的 屬性。 ThreadAbortException在呼叫 之前 Resume ,不會在暫停的執行緒中擲回 。

如果在 Abort Managed 執行緒執行 Unmanaged 程式碼時在 Managed 執行緒上呼叫 , ThreadAbortException 則線上程返回 Managed 程式碼之前,不會擲回 。

如果同時呼叫兩次,則一個呼叫 Abort 可以設定狀態資訊,而另一個呼叫執行 Abort 。 不過,應用程式無法偵測到這種情況。

線上程上叫用之後 Abort ,執行緒的狀態會包含 AbortRequested 。 當執行緒因為成功呼叫 Abort 而終止之後,執行緒的狀態就會變更為 Stopped 。 具有足夠許可權時,屬於 目標的 Abort 執行緒可以使用 方法來取消中止 ResetAbort 。 如需示範呼叫 方法的 ResetAbort 範例,請參閱 ThreadAbortException 類別。

另請參閱

適用於

Abort(Object)

來源:
Thread.cs
來源:
Thread.cs
來源:
Thread.cs

警告

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是應用程式程式碼可攔截的特殊例外狀況,但除非 ResetAbort 呼叫,否則會在區塊結尾 catch 重新擲回。 ResetAbort 取消中止的要求,並防止 ThreadAbortException 終止執行緒。 在中止執行緒之前,會先執行未執行的 finally 區塊。

注意

當執行緒本身呼叫 Abort 時,效果類似于擲回例外狀況; ThreadAbortException 會立即發生,而且結果可預測。 不過,如果某個執行緒在另一個執行緒上呼叫 Abort ,中止會中斷任何正在執行的程式碼。 可能會中止靜態建構函式。 在罕見的情況下,這可能會防止在該應用程式域中建立該類別的實例。

執行緒不保證會立即中止或完全中止。 如果執行緒在中止程式中呼叫的區塊中 finally 執行未系結的計算量,因而無限期地延遲中止,就會發生這種情況。 若要等候執行緒中止,您可以在呼叫 方法之後線上程上呼叫 JoinAbort 方法,但不保證等候將會結束。

注意

如果中止的執行緒位於程式碼的受保護區域中,例如 catch 區塊、 finally 區塊或限制執列區域,則呼叫 Abort 的執行緒可能會封鎖。 如果呼叫 Abort 的執行緒保留中止執行緒所需的鎖定,就會發生死結。

如果在 Abort 尚未啟動的執行緒上呼叫 ,則會在呼叫 時 Start 中止執行緒。 如果在 Abort 封鎖或睡眠的執行緒上呼叫 ,執行緒就會中斷,然後中止。

如果在 Abort 已暫停的執行緒上呼叫 , ThreadStateException 則會在呼叫 Abort 的執行緒中擲回 ,並將 AbortRequested 加入至 ThreadState 中止之執行緒的 屬性。 ThreadAbortException在呼叫 之前 Resume ,不會在暫停的執行緒中擲回 。

如果在 Abort Managed 執行緒執行 Unmanaged 程式碼時在 Managed 執行緒上呼叫 , ThreadAbortException 則線上程返回 Managed 程式碼之前,不會擲回 。

如果同時呼叫兩次,則一個呼叫 Abort 可以設定狀態資訊,而另一個呼叫執行 Abort 。 不過,應用程式無法偵測到這種情況。

線上程上叫用之後 Abort ,執行緒的狀態會包含 AbortRequested 。 當執行緒因為成功呼叫 Abort 而終止之後,執行緒的狀態就會變更為 Stopped 。 具有足夠許可權時,屬於 目標的 Abort 執行緒可以使用 方法來取消中止 ResetAbort 。 如需示範呼叫 方法的 ResetAbort 範例,請參閱 ThreadAbortException 類別。

另請參閱

適用於