C# 多執行緒引數傳遞

尋找"四葉草"發表於2016-05-23

1、通過實體類來傳遞(可以傳遞多個引數與獲取返回值),demo如下:

需要線上程中呼叫的函式:

通過實體來來封裝:

呼叫:

小注:

  • 必須注意IsBackground的問題,如果IsBackground為false的,則Windows程式在退出的時候,不會為你自動退出該執行緒。也就是實際上你的應用程式未結束。
  • MSDN推薦:多執行緒方法呼叫提供引數的最好辦法是將目標方法包裹在類中,併為該類定義欄位,這些欄位將被用作新執行緒的引數。
  • 這種方法的優點是,任何時候想要啟動新執行緒,都可以建立類的新例項,該例項帶有自身的引數。
  • BackgroundWorker 類
  • ThreadStart中的函式是沒有返回值和引數的

2、非同步呼叫中的引數和返回值
能完美解決引數和返回值的是使用非同步呼叫的方式。非同步呼叫和Thread相比,一個最大的劣勢是不能控制其優先順序。

具體程式碼如下:

簡化:

小注:

通過這種方式生成新執行緒是執行在後臺的(background),優先順序為normal

3、使用 BackgroundWorker

多執行緒返回值最簡單方法是:使用 BackgroundWorker 元件來管理執行緒,在任務完成時引發事件,然後用事件處理程式處理結果。

小注:
BackgroundWorker 元件用來執行諸如資料庫事務、檔案下載等耗時的非同步操作。
在應用程式中新增一個BackgroundWorker例項,如果用的是VS,可以從工具上直接拖到應用程式:

為了開始在後臺操作,必須呼叫BackgroundWorker的RunWorkerAsync()方法,當呼叫此方時,BackgroundWorker 通過觸發DoWork 事件,開始執行後臺操作,DoWork 事件的程式碼是在另一個執行緒裡執行的。

當後臺操作完成以後,無論是completed 還是cancelled,則RunWorkerCompleted 事件被觸發,通過此方法可以將後臺操作的完成結果反饋給使用者。

另外,通過RunWorkerCompletedEventArgs例項的Cancelled 屬性,以判斷是否是Cancel操作使得後臺操作終止。

具體demo如下:

demo程式碼來自MSDN:點選開啟連結

參考文章:點選開啟連結

4、如果不如返回值的時候,應該怎麼優雅的寫呢?匿名函式啊

FunctionClass類新增,測試函式如下:

呼叫如下:

小注:

如果通過WCF來呼叫的話,應該把起執行緒的函式放到服務端,如果放到客戶端,很容易因為WCF客戶端的時間限制,造成造成主程式的莫名崩潰。

崩潰的原因主要是客戶端wcf響應時間是有限制。

相關文章