HOWTO · Csharp
在 C# 中停止執行緒
本文說明如何在 C# 中啟動和停止執行緒。
本頁內容
當 C# 應用程式必須停止由 Thread 建立的工作執行緒時,舊式的 Abort() 方法可以要求執行階段將其終止。這項技術僅適用於支援 Thread.Abort() 的執行階段;現代 .NET 執行階段可能會改為擲回 PlatformNotSupportedException。對新程式碼而言,使用 CancellationToken 的協同式取消通常更安全,因為工作執行緒可以釋放資源,並讓共用狀態維持在已知且一致的狀態。
在支援的執行階段上,Abort() 會在目標執行緒中造成 ThreadAbortException。這個例外是非同步的,因此工作執行緒可能在持有鎖定或更新共用資料時遭到中斷。請將此範例視為相容性參考,只有在目標執行階段明確支援此 API 時才使用它。
在 C# 中使用 Abort() 方法停止執行緒
Thread.Abort() 文件說明了這項舊式操作的執行階段支援情況。System.Threading 命名空間包含 Thread 類型,以及它的 Start() 和 Abort() 方法。下面的完整範例定義 ThreadDemo.threadAssign(),建立包含 Main() 的 ThreadExampleMain 類別,啟動工作執行緒,並要求它停止。
迴圈設定為執行六次,而不是四次。Thread is abort 這一行會在發出中止要求前立即印出,因此它只是診斷訊息,不能證明工作執行緒已停止。
以下獨立完整的原始碼會建立工作執行緒、啟動它、要求它停止,並等待工作執行緒:
using System;
using System.Threading;
public class ThreadDemo {
public void threadAssign() {
for (int threadCount = 0; threadCount < 6; threadCount++) {
Console.WriteLine("First Thread");
Thread.Sleep(10);
}
}
}
public class ThreadExampleMain {
public static void Main() {
ThreadDemo threadDemo = new ThreadDemo();
Thread thread = new Thread(new ThreadStart(threadDemo.threadAssign));
thread.Start();
Console.WriteLine("Thread is abort");
try {
thread.Abort();
}
catch (PlatformNotSupportedException) {
Console.WriteLine("Abort() is not supported by this runtime.");
}
thread.Join();
}
}
Thread is abort
First Thread
提供的執行證據記錄了這段原始碼的一次完成執行。它確認 Thread is abort 在中止要求之前輸出;First Thread 各行的順序和數量取決於執行緒排程,因此不應預期固定的輸出內容。依賴其行為前,請先在你的目標執行階段上執行它。
在支援 Abort() 的執行階段上,工作執行緒會收到非同步的 ThreadAbortException 並停止。這與 Main() 中由 Abort() 同步擲出的例外不同。在發出要求之前出現的 First Thread 行數和確切順序取決於執行緒排程;迴圈本身允許執行六次。如果 Abort() 擲回 PlatformNotSupportedException,工作執行緒可能會繼續執行,而 catch 分支會回報這項同步失敗;該訊息是診斷資訊,不能證明執行階段在所有情境下都不支援此 API。無論哪一種情況,都不要把 Thread is abort 這一行當作已終止的證據。兩種路徑之後,thread.Join() 都會等待工作執行緒完成後才讓 Main() 返回;當中止操作不受支援時,這表示等待工作執行緒正常完成。