C 多執行緒引數傳遞

2022-08-21 05:24:17 字數 2586 閱讀 4238

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

namespace threadparameterdemo}}

通過實體來來封裝:
namespace threadparameterdemo

public void testfunction()}}

呼叫:

private void form1_load(object sender, eventargs e)

小注:必須注意isbackground的問題。假設isbackground為false的,則windows程式在退出的時候,不會為你自己主動退出該執行緒。也就是實際上你的應用程式未結束。

msdn推薦:多執行緒方法呼叫提供引數的最好辦法是將目標方法包裹在類中,並為該類定義字段,這些欄位將被用作新執行緒的引數。

這樣的方法的長處是,不論什麼時候想要啟動新執行緒。都能夠建立類的新例項,該例項帶有自身的引數。

backgroundworker 類

threadstart中的函式是沒有返回值和引數的

2、非同步呼叫中的引數和返回值

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

詳細**例如以下:

public delegate string delegatefunction(string name,int age);//託付

delegatefunction df;

private void form1_load(object sender, eventargs e)

簡化:

public funcdf;//託付

private void form1_load(object sender, eventargs e)

小注:

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

3、使用 backgroundworker

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

backgroundworker backgroundworker1 = new backgroundworker();
為了開始在後台操作,必須呼叫backgroundworker的runworkerasync()方法。當呼叫此方時,backgroundworker 通過觸發dowork 事件,開始執行後台操作。dowork 事件的**是在還有乙個執行緒裡執行的。

當後台操作完畢以後,不管是completed 還是cancelled,則runworkercompleted 事件被觸發。通過此方法能夠將後台操作的完畢結果反饋給使用者。

另外,通過runworkercompletedeventargs例項的cancelled 屬性,以推斷是否是cancel操作使得後台操作終止。

詳細demo例如以下:

using system;

using system.windows.forms;

private void form2_load(object sender, eventargs e)

private void button1_click(object sender, eventargs e)

private system.componentmodel.backgroundworker backgroundworker1

= new system.componentmodel.backgroundworker();

private void testarea2()

private void initializebackgroundworker()

private void backgroundworker1_dowork(

object sender,

system.componentmodel.doworkeventargs e)

private void backgroundworker1_runworkercompleted(

object sender,

system.componentmodel.runworkercompletedeventargs e)}}

demo**來自msdn:

點選開啟鏈結

參考文章:

點選開啟鏈結

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

functionclass類新增,測試函式例如以下:

public static void testfunction2(string name, int age)

呼叫例如以下:

private void form1_load(object sender, eventargs e)

));t1.start();

}

小注:

假設通過wcf來呼叫的話,應該把起執行緒的函式放到服務端,假設放到client。非常easy由於wcfclient的時間限制,造成造成主程式的莫名崩潰。

崩潰的原因主要是clientwcf響應時間是有限制。

C 多執行緒引數傳遞

在多執行緒或單執行緒任務中,讓執行緒帶傳入引數一直是個麻煩的問題,通常有種方法就是以類,對像的變數來傳引數,這種方法理解上很簡單不過在某些場合使用很麻煩,這裡就不介紹了,我們主要介紹一種.net2.0中新增加的帶引數執行執行緒的方法,示例程式如下 parameterizedthreadstart p...

C 多執行緒引數傳遞

c 多執行緒引數傳遞 在多執行緒或單執行緒任務中,讓執行緒帶傳入引數一直是個麻煩的問題,通常有種方法就是以類,對像的變數來傳引數,這種方法理解上很簡單不過在某些場合使用很麻煩,這裡就不介紹了,我們主要介紹一種.net2.0中新增加的帶引數執行執行緒的方法,示例程式如下 parameterizedth...

C 多執行緒引數傳遞

c 多執行緒引數傳遞 在多執行緒或單執行緒任務中,讓執行緒帶傳入引數一直是個麻煩的問題,通常有種方法就是以類,對像的變數來傳引數,這種方法理解上很簡單不過在某些場合使用很麻煩,這裡就不介紹了,我們主要介紹一種.net2.0中新增加的帶引數執行執行緒的方法,示例程式如下 parameterizedth...