暫止和繼續執行緒

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

您也可以讓執行緒自己進入休眠狀態, 當執行緒處於封鎖或休眠狀態時,您可以使用 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

ThreadInterruptedException

ThreadAbortException

概念

同步處理原始物件概觀

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

其他資源

Managed 執行緒處理

使用執行緒和執行緒處理