天天看點

《C#多線程程式設計實戰(原書第2版)》——1.9 向線程傳遞參數

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

本節将描述如何提供一段代碼來使用要求的資料運作另一個線程。我們将介紹不同的方式來滿足此任務,并且回顧常見的錯誤。

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

請執行以下步驟來了解如何給一個線程傳遞參數:

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

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

《C#多線程程式設計實戰(原書第2版)》——1.9 向線程傳遞參數

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

《C#多線程程式設計實戰(原書第2版)》——1.9 向線程傳遞參數
《C#多線程程式設計實戰(原書第2版)》——1.9 向線程傳遞參數

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

《C#多線程程式設計實戰(原書第2版)》——1.9 向線程傳遞參數

5.運作程式。

當主程式啟動時,首先建立了threadsample類的一個對象,并提供了一個疊代次數。然後使用該對象的countnumbers方法啟動線程。該方法運作在另一個線程中,但是使用數字10,該數字是通過threadsample對象的構造函數傳入的。是以,我們隻是使用相同的間接方式将該疊代次數傳遞給另一個線程。

另一種傳遞資料的方式是使用thread.start方法。該方法會接收一個對象,并将該對象傳遞給線程。為了應用該方法,線上程中啟動的方法必須接受object類型的單個參數。在建立threadtwo線程時示範了該方式。我們将8作為一個對象傳遞給了count方法,然後count方法被轉換為整型。

接下來的方式是使用lambda表達式。lambda表達式定義了一個不屬于任何類的方法。我們建立了一個方法,該方法使用需要的參數調用了另一個方法,并在另一個線程中運作該方法。當啟動threadthree線程時,列印出了12個數字,這正是我們通過lambda表達式傳遞的數字。

使用lambda表達式引用另一個c#對象的方式被稱為閉包。當在lambda表達式中使用任何局部變量時,c#會生成一個類,并将該變量作為該類的一個屬性。是以實際上該方式與threadone線程中使用的一樣,但是我們無須定義該類,c#編譯器會自動幫我們實作。

這可能會導緻幾個問題。例如,如果在多個lambda表達式中使用相同的變量,它們會共享該變量值。在前一個例子中示範了這種情況。當啟動threadfour和threadfive線程時,它們都會列印20,因為在這兩個線程啟動之前變量被修改為20。