共用方式為


暫止和繼續執行緒

更新:2007 年 11 月

同步處理執行緒活動最常見的方式是封鎖及釋放執行緒,或者是鎖定物件或程式碼區域。如需這些鎖定及封鎖機制的詳細資訊,請參閱同步處理原始物件概觀

您也可以讓執行緒自己進入休眠狀態,當執行緒處於封鎖或休眠狀態時,您可以使用 ThreadInterruptedException 讓它們離開等候狀態。

Thread.Sleep 方法

呼叫 Thread.Sleep 方法會導致現行執行緒立即封鎖,封鎖的時間是您傳送至 Thread.Sleep 的時間 (毫秒數),而剩餘的時間配量會讓給另一個執行緒。執行緒無法在另一個執行緒上呼叫 Thread.Sleep

呼叫 Thread.Sleep 並設定 Timeout.Infinite 會導致執行緒休眠,直到該執行緒被另一個呼叫 Thread.Interrupt 的執行緒中斷,或直到被 Thread.Abort 終止。

中斷執行緒

你可以在封鎖的執行緒上呼叫 Thread.Interrupt,以擲回 ThreadInterruptedException 來中斷該執行緒的封鎖呼叫,進而中斷執行緒的等待狀態。執行緒應攔截 ThreadInterruptedException 並且執行任何可繼續工作的動作。如果執行緒忽略例外狀況,則執行階段會攔截例外狀況並停止執行緒。

注意事項:

如果目標執行緒在呼叫 Thread.Interrupt 時沒有封鎖,執行緒就不會中斷,直到受到封鎖為止。如果執行緒從來沒有封鎖,它可以在未曾中斷的情況下完成。

如果等候屬於 Managed 等候,則 Thread.InterruptThread.Abort 都會立即喚醒執行緒。如果等候屬於 Unmanaged 等候 (例如,對 Win32 WaitForSingleObject 函式的平台叫用呼叫),則 Thread.InterruptThread.Abort 都無法控制執行緒,必須等到執行緒返回或呼叫進入 Managed 程式碼為止。在 Managed 程式碼中,其行為如下所示:

暫止和繼續 (已經過時)

重要事項:

在 .NET Framework 2.0 版中,Thread.SuspendThread.Resume 方法是標記為過時,將在未來的版本中移除。

您也可以呼叫 Thread.Suspend 以暫停執行緒。當執行緒本身呼叫 Thread.Suspend 時,呼叫會封鎖直到有另一個執行緒繼續該執行緒為止。當執行緒在另一個執行緒上呼叫 Thread.Suspend 時,該呼叫為未封鎖的呼叫,會導致其他執行緒暫停。呼叫 Thread.Resume 會中斷另一個執行緒的暫止狀態,並導致執行緒繼續執行,而不管已呼叫 Thread.Suspend 的次數。例如,如果您連續呼叫 Thread.Suspend 五次,然後呼叫 Thread.Resume,則執行緒會在呼叫 Thread.Resume 之後立即繼續執行。

不同於 Thread.SleepThread.Suspend 不會導致執行緒立即停止執行。Common Language Runtime 必須等候,直到執行緒已到達安全點才能暫止執行緒。如果執行緒尚未開始或已停止,就無法將執行緒暫止。若需安全點的詳細資訊,請參閱 Thread.Suspend、記憶體回收和安全點

重要事項:

對應用程式而言,Thread.SuspendThread.Resume 方法通常沒有什麼用處,並且不應與同步處理機制混淆。因為 Thread.SuspendThread.Resume 並不需要受控制的執行緒合作,所以具有高度干擾性,並且會引發如死結 (Deadlock) 之類的嚴重應用程式問題 (例如,如果您暫止的執行緒持有另一個執行緒所需的資源)。

某些應用程式不需要控制執行緒優先權來提高效能。若要控制優先權,您應使用 Priority 屬性,而不是 Thread.Suspend

請參閱

概念

同步處理原始物件概觀

Thread.Suspend、記憶體回收和安全點

參考

Thread

ThreadInterruptedException

ThreadAbortException

其他資源

Managed 執行緒

使用執行緒和執行緒處理