天天看點

《C#多線程程式設計實戰(原書第2版)》——3.6 線上程池中使用等待事件處理器及逾時

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

本節将描述如何線上程池中對操作實作逾時,以及如何線上程池中正确地等待。

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

請執行以下步驟來了解線上程池中實作逾時及正确的等待:

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

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

《C#多線程程式設計實戰(原書第2版)》——3.6 線上程池中使用等待事件處理器及逾時

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

《C#多線程程式設計實戰(原書第2版)》——3.6 線上程池中使用等待事件處理器及逾時
《C#多線程程式設計實戰(原書第2版)》——3.6 線上程池中使用等待事件處理器及逾時
《C#多線程程式設計實戰(原書第2版)》——3.6 線上程池中使用等待事件處理器及逾時

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

《C#多線程程式設計實戰(原書第2版)》——3.6 線上程池中使用等待事件處理器及逾時

5.運作程式。

線程池還有一個有用的方法:threadpool.registerwaitforsingleobject。該方法允許我們将回調函數放入線程池中的隊列中。當提供的等待事件處理器收到信号或發生逾時時,該回調函數将被調用。這允許我們為線程池中的操作實作逾時功能。

首先注冊了處理逾時的異步操作。有兩種情況會觸發該異步操作。第一種情況是接收到了manualrestevent對象的信号,當工作者操作成功完成後會發出該信号。第二種情況是在第一個操作完成之前逾時。如果逾時了,那麼會使用cancellationtoken來取消第一個操作。

然後我們向線程池中放入一個耗時長的操作。它會運作6秒鐘,如果成功完

成則會設定一個manualresetevent信号類。在其他情況下,比如需要取消該操作,那麼該操作會被丢棄。

最後,為操作提供5秒的逾時時間是不夠的。這是因為操作會花費6秒來完成,隻能取消該操作。是以如果提供7秒的逾時時間是可行的,該操作會順利完成。

當有大量的線程必須處于阻塞狀态中等待一些多線程事件發信号時,以上方式非常有用。借助于線程池的基礎設施,我們無需阻塞所有這樣的線程。可以釋放這些線程直到信号事件被設定。在伺服器端應用程式中這是個非常重要的應用場景,因為伺服器端應用程式要求高伸縮性及高性能。