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

3.在main方法下面加入以下代碼片段:
4.在main方法中加入以下代碼片段:
5.運作程式。
首先定義了asyncoperation方法,它接受單個object類型的參數。然後使用queueuser-workitem方法将該方法放到線程池中。接着再次放入該方法,但是這次給方法調用傳入了一個state對象。該對象将作為state參數傳遞給asynchronousoperation方法。
在操作完成後讓線程睡眠一秒鐘,進而讓線程池擁有為新操作重用線程的可能性。如果注釋掉所有的thread.sleep調用,那麼所有列印出的線程id多半是不一樣的。如果id是一樣的,那很可能是前兩個線程被重用來運作接下來的兩個操作。
首先将一個lambda表達式放置到線程池中。這裡沒什麼特别的。我們使用了lambda表達式文法,進而無須定義一個單獨的方法。
然後,我們使用閉包機制,進而無須傳遞lambda表達式的狀态。閉包更靈活,允許我們向異步操作傳遞一個以上的對象而且這些對象具有靜态類型。是以之前介紹的傳遞對象給方法回調的機制既備援又過時。在c#中有了閉包後就不再需要使用它了。