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 和更新版本上,呼叫這個方法會產生編譯時期警告。 這個方法會在 PlatformNotSupportedException .NET 5 和更新版本和 .NET Core 的執行時間擲回 。

線上程上叫用這個方法時,系統會線上程中擲回 ThreadAbortException ,以中止它。 ThreadAbortException是可由應用程式程式碼攔截的特殊例外狀況,但除非 ResetAbort 呼叫 ,否則會在區塊結尾 catch 重新擲回。 ResetAbort 取消中止的要求,並防止 ThreadAbortException 終止執行緒。 在中止執行緒之前,會先執行未執行的 finally 區塊。

注意

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

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

注意

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

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

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

如果在 Abort Managed 執行緒上執行 Unmanaged 程式碼時呼叫 , ThreadAbortException 則除非執行緒回到 Managed 程式碼,否則不會擲回 。

如果同時呼叫兩 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);
        }
    }
}
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 和更新版本上,呼叫這個方法會產生編譯時期警告。 這個方法會在 PlatformNotSupportedException .NET 5 和更新版本和 .NET Core 的執行時間擲回 。

線上程上叫用這個方法時,系統會線上程中擲回 ThreadAbortException ,以中止它。 ThreadAbortException是可由應用程式程式碼攔截的特殊例外狀況,但除非 ResetAbort 呼叫 ,否則會在區塊結尾 catch 重新擲回。 ResetAbort 取消中止的要求,並防止 ThreadAbortException 終止執行緒。 在中止執行緒之前,會先執行未執行的 finally 區塊。

注意

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

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

注意

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

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

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

如果在 Abort Managed 執行緒上執行 Unmanaged 程式碼時呼叫 , ThreadAbortException 則除非執行緒回到 Managed 程式碼,否則不會擲回 。

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

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

另請參閱

適用於