天天看點

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

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

本節中的示例借助于autoresetevent類來從一個線程向另一個線程發送通知。autoresetevent類可以通知等待的線程有某事件發生。

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

請執行以下步驟來了解如何借助autoresetevent類從一個線程中向另一個線程發送通知:

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

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

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

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

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

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

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

5.運作程式。

當主程式啟動時,定義了兩個autoresetevent執行個體。其中一個是從子線程向主線程發信号,另一個執行個體是從主線程向子線程發信号。我們向autoresetevent構造方法傳入false,定義了這兩個執行個體的初始狀态為unsignaled。這意味着任何線程調用這兩個對象中的任何一個的waitone方法将會被阻塞,直到我們調用了set方法。如果初始事件狀态為true,那麼autoresetevent執行個體的狀态為signaled,如果線程調用waitone方法則會被立即處理。然後事件狀态自動變為unsignaled,是以需要再對該執行個體調用一次set方法,以便讓其他的線程對該執行個體調用waitone方法進而繼續執行。

然後我們建立了第二個線程,其會執行第一個操作10秒鐘,然後等待從第二個線程發出的信号。該信号意味着第一個操作已經完成。現在第二個線程在等待主線程的信号。我們對主線程做了一些附加工作,并通過調用_mainevent.set方法發送了一個信号。然後等待從第二個線程發出的另一個信号。

autoresetevent類采用的是核心時間模式,是以等待時間不能太長。使用2.6節中的manualreseteventslim類更好,因為它使用的是混合模式。