Worker 類包含另一個方法,該方法用於通知
DoWork 它應當返回。此方法名為 RequestStop,如下所示:
volatile 關鍵字用於通知編譯器,將有多個線程訪問
_shouldStop 數據成員,因此它不應當對此成員的狀態做任何優化假設。有關更多信息,請參見 volatile(C# 參考)。
此時,盡管輔助線程對象已存在並已配置,但尚未創建實際的輔助線程。只有當
Main 調用 Start 方法后,才會創建實際的輔助線程:
下一步,通過調用 Sleep 來將主線程中斷片刻。這保證了輔助線程的
DoWork 函數在 Main 函數執行其他任何命令之前,在 DoWork 方法內部執行若干次循環:
在 1 毫秒之后,Main 將通知輔助線程對象,它應當使用
Worker.RequestStop 方法(前面已介紹)自行終止:
還可以通過調用 Abort 來從一個線程終止另一個線程,但這會強行終止受影響的線程,而不管它是否已完成自己的任務,並且不提供清理資源的機會。此示例中顯示的技術是首選方法。
最后,Main 函數對輔助線程對象調用 Join 方法。此方法導致當前線程阻塞或等待,直到對象所表示的線程終止。因此,直到輔助線程返回后,Join 才會返回,然后自行終止:
此時,只有執行
Main 的主線程還存在。它會顯示一條最終消息,然后返回,從而使主線程也終止。
示例
示例輸出
main thread: starting worker thread... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: terminating gracefully... main thread: worker thread has terminated