天天看點

《C#多線程程式設計實戰(原書第2版)》——2.6 使用ManualResetEventSlim類

本節書摘來自華章出版社《c#多線程程式設計實戰(原書第2版)》一書中的第2章,第2.6節,作者(美)易格恩·阿格佛溫(eugene agafonov),黃博文 黃輝蘭 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

本節将描述如何使用manualreseteventslim類來線上程間以更靈活的方式傳遞信号。

為了學習本節,你需要安裝visual studio 2015。除此之外無需其他準備。本節的源代碼放置在booksampleschapter2recipe5目錄中。

請執行以下步驟來了解manualreseteventslim類的使用方法:

1.啟動visual studio 2015。建立一個c#控制台應用程式項目。

2.在program.cs檔案中加入以下using指令:

《C#多線程程式設計實戰(原書第2版)》——2.6 使用ManualResetEventSlim類

3.在main方法下面加入以下代碼片段:

《C#多線程程式設計實戰(原書第2版)》——2.6 使用ManualResetEventSlim類

4.在main方法中加入以下代碼片段:

《C#多線程程式設計實戰(原書第2版)》——2.6 使用ManualResetEventSlim類

5.運作程式。

當主程式啟動時,首先建立了manualreseteventslim類的一個執行個體。然後啟動了三個線程,等待事件信号通知它們繼續執行。

manualresetevnetslim的整個工作方式有點像人群通過大門。2.5節中讨論過的autoresetevent事件像一個旋轉門,一次隻允許一人通過。manualreseteventslim是manual-resetevent的混合版本,一直保持大門敞開直到手動調用reset方法。當調用_mainevent.set時,相當于打開了大門進而允許準備好的線程接收信号并繼續工作。然而線程3還處于睡眠狀态,沒有趕上時間。當調用_mainevent.reset相當于關閉了大門。最後一個線程已經準備好執行,但是不得不等待下一個信号,即要等待好幾秒鐘。

在前面某小節中,我們使用了一種無法在作業系統層面工作的混合模式。如果我們需要全局事件,則可以使用eventwaithandle類,其是autoresetevent和manualresetevent類的基類。