終結執行緒
更新:2007 年 11 月
Abort 方法是用來永久停止 Managed 執行緒。當您呼叫 Abort 時,Common Language Runtime 會在目標執行緒中擲回 ThreadAbortException,而目標執行緒可加以攔截。如需詳細資訊,請參閱 Thread.Abort。
注意事項: |
---|
如果在呼叫執行緒的 Abort 方法時,此執行緒正在執行 Unmanaged 程式碼,則執行階段會為它標記 ThreadState.AbortRequested。當此執行緒返回 Managed 程式碼時,會擲回例外狀況。 |
一旦執行緒被中止,就無法重新啟動。
Abort 方法不會讓此執行緒立即中止,因為目標執行緒可以攔截 ThreadAbortException,並執行 finally 區塊中任意數量的程式碼。如果您需要等候到此執行緒結束,您可以呼叫 Thread.Join;Thread.Join 是一個封鎖的呼叫,此呼叫要等到此執行緒實際停止執行或經過了選擇性的逾時間隔之後,才會傳回。中止的執行緒可能會呼叫 ResetAbort 方法,或是在 finally 區塊中執行無限制的處理;因此,如果您未指定逾時,不保證等候一定會結束。
等候 Thread.Join 方法呼叫的執行緒可被其他呼叫 Thread.Interrupt 的執行緒所中斷。
處理 ThreadAbortException
如果您預期執行緒要中止,不論其形式是當做從您自己的程式碼呼叫 Abort 的結果,或是當做執行緒執行所在的應用程式定義域卸載的結果 (AppDomain.Unload 使用 Thread.Abort 來結束執行緒),則執行緒必須處理 ThreadAbortException,並執行 finally 子句中的任何最終處理,如下列程式碼所示。
Try
' Code that is executing when the thread is aborted.
Catch ex As ThreadAbortException
' Clean-up code can go here.
' If there is no Finally clause, ThreadAbortException is
' re-thrown by the system at the end of the Catch clause.
Finally
' Clean-up code can go here.
End Try
' Do not put clean-up code here, because the exception
' is rethrown at the end of the Finally clause.
try
{
// Code that is executing when the thread is aborted.
}
catch (ThreadAbortException ex)
{
// Clean-up code can go here.
// If there is no Finally clause, ThreadAbortException is
// re-thrown by the system at the end of the Catch clause.
}
// Do not put clean-up code here, because the exception
// is rethrown at the end of the Finally clause.
您的清除程式碼必須在 catch 子句或 finally 子句中,因為在沒有 finally 子句的情況下遇到 finally 子句結尾或 catch 子句結尾時,系統會重新擲回 ThreadAbortException。
您可以藉由呼叫 Thread.ResetAbort 方法,防止系統重新擲回此例外狀況。但是,只有當您的程式碼會造成 ThreadAbortException 時,才應該這麼做。