本節書摘來自華章出版社《c#多線程程式設計實戰(原書第2版)》一書中的第3章,第3.6節,作者(美)易格恩·阿格佛溫(eugene agafonov),黃博文 黃輝蘭 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
本節将描述如何線上程池中對操作實作逾時,以及如何線上程池中正确地等待。
為了學習本節,你需要安裝visual studio 2015。除此之外無需其他準備。本節的源代碼放置在booksampleschapter3recipe5目錄中。
請執行以下步驟來了解線上程池中實作逾時及正确的等待:
1.啟動visual studio 2015。建立一個c#控制台應用程式項目。
2.在program.cs檔案中加入以下using指令:

3.在main方法下面加入以下代碼片段:
4.在main方法中加入以下代碼片段:
5.運作程式。
線程池還有一個有用的方法:threadpool.registerwaitforsingleobject。該方法允許我們将回調函數放入線程池中的隊列中。當提供的等待事件處理器收到信号或發生逾時時,該回調函數将被調用。這允許我們為線程池中的操作實作逾時功能。
首先注冊了處理逾時的異步操作。有兩種情況會觸發該異步操作。第一種情況是接收到了manualrestevent對象的信号,當工作者操作成功完成後會發出該信号。第二種情況是在第一個操作完成之前逾時。如果逾時了,那麼會使用cancellationtoken來取消第一個操作。
然後我們向線程池中放入一個耗時長的操作。它會運作6秒鐘,如果成功完
成則會設定一個manualresetevent信号類。在其他情況下,比如需要取消該操作,那麼該操作會被丢棄。
最後,為操作提供5秒的逾時時間是不夠的。這是因為操作會花費6秒來完成,隻能取消該操作。是以如果提供7秒的逾時時間是可行的,該操作會順利完成。
當有大量的線程必須處于阻塞狀态中等待一些多線程事件發信号時,以上方式非常有用。借助于線程池的基礎設施,我們無需阻塞所有這樣的線程。可以釋放這些線程直到信号事件被設定。在伺服器端應用程式中這是個非常重要的應用場景,因為伺服器端應用程式要求高伸縮性及高性能。