C 筆記19 多執行緒之執行緒啟動 引數 返回值

2022-02-20 05:55:01 字數 4319 閱讀 8064

c#筆記19:多執行緒之執行緒啟動、引數、返回值

本章概要:

1:如何新起執行緒

2:thread傳引數及取得返回值

3:isbackground

4:非同步呼叫中的引數和返回值

新起乙個執行緒的方法,可以使用thread,backgroundworker ,threadpool,控制項.begininvoke,委託.begininvoke,timer。

建立多執行緒處理應用程式的最可靠方法是使用 backgroundworker 元件。但是,當你需要對執行緒進行精細控制的時候,就需要thread。總體來說,各種方法各有各的優點,在這裡不做細說。

備註:嚴格意義上,非同步不是新執行緒。

thread的有兩個建構函式,其中乙個使用引數是threadstart,說明該執行緒在建構函式中不能帶入引數。還有乙個parameterizedthreadstart,則可以為你的執行緒傳入引數。還有乙個方法是為你的執行緒方法提供乙個包裹類,這也可以解決返回值的問題。不過,這種方法在我看來是最醜陋的寫法(參考

大部分情況下,乙個優良的寫法是使用匿名函式,如下:

int arg1 = 10;

string arg2 = "argument temp";

thread t1 = new thread(new threadstart(delegate

));

以上的寫法,仍然無法解決返回值的問題。如果要獲取返回值的,則使用委託或包裹類等其它方法。但以上方法解決了引數的問題。

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

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

首先,看**:

**段1:

public

delegate

string funchandle(int data1, int data2);

funchandle fh ;

private

void bt_temp_click(object sender, routedeventargs e)

public

void asynccallbackimpl(iasyncresult ar)

string foo(int data1, int data2)

在非同步呼叫中,如果想在非同步的**函式中,得到非同步函式的返回值(如上面**中的foo函式的string返回值),則必須要在**函式中使用endinvoke(關於endinvoke會在下文描述)。在上面的例子是如下這句。

string re = fh.endinvoke(ar);

但是,有的時候fh並不見得是個類變數,這個時候,就需要我們將endinvoke的執行主體由begininvoke傳遞進去。看修改過後的**片段。

**段2:

public

delegate

string funchandle(int data1, int data2);

private

void bt_temp_click(object sender, routedeventargs e)

public

void asynccallbackimpl(iasyncresult ar)

string foo(int data1, int data2)

通過舉一反三,其實begininvoke的最後乙個引數,可以是任何物件,看具體的應用場景即可。

下面再介紹一下endinvoke。endinvoke在**函式中,用於承載執行的主體函式的返回值。在另外乙個情況下,即上面的**片段乙個簡化版本,如下:

**段3:

public

delegate

string funchandle(int data1, int data2);

private

void bt_temp_click(object sender, routedeventargs e)

string foo(int data1, int data2)

我們可以看到,在這個**片段中,我們根本沒有使用**函式,那麼,我們就需要通過endinvoke來阻滯主線程,使得返回函式主體的返回值。

再多說一點,呼叫了 begininvoke 後,可以:

1.進行某些操作,然後呼叫 endinvoke 一直阻塞到呼叫完成。如上文的最後乙個**片段。

2.使用 iasyncresult.asyncwaithandle 獲取 waithandle,使用它的 waitone 方法將執行一直阻塞到發出 waithandle 訊號,然後呼叫endinvoke。這裡主要是主程式等待非同步方法,等待非同步方法的結果。見**段4。

3.輪詢由 begininvoke 返回的 iasyncresult,iasyncresult.iscompeted確定非同步呼叫何時完成,然後呼叫 endinvoke。

4.將用於**方法的委託傳遞給 begininvoke。該方法在非同步呼叫完成後在 threadpool 執行緒上執行,它可以呼叫 endinvoke。這是在強制裝換**函式裡面iasyncresult.asyncstate(begininvoke方法的最後乙個引數)成委託,然後用委託執行endinvoke。即如上**片段2。

**段4:

public

delegate

string funchandle(int data1, int data2);

string _stemp = string.empty;

private

void bt_temp_click(object sender, routedeventargs e)

string foo(int data1, int data2)

參考:練習:

which code segment should you use? 

a. private void performcalculation()    

private void dowork()

tmj .net培訓,開創 200元/月,學到會!

net c# 入門級

.net c# 專業級

.net 架構級

bs系統專業級

bs系統安全

1.開篇及c#程式、解決方案的結構

2.原始碼管理之tfs入門

3.打老鼠初級

……21.cms之主要功能實現

22.程序和執行緒基礎

23.型別轉換

24.演算法基礎

25.初級課程之剩餘知識點

1.消滅打老鼠遊戲中的自定義委託

2.垃圾**

3.dispose模式

……16.異常使用指導

17.最常用的重構指導

18.debug和ide的高階

19.resharper的使用

20.ilspy的使用

1.socket入門

2.打造打老鼠遊戲網路版

3.wcf入門

……10.依賴注入

11.萬物兼可測試

12.軟體指標之覆蓋率計算

13.軟體指標之**行

14.軟體指標之圈複雜度、巢狀深度

1.html

2.webform原理

3.css必知必會

……19.讓瀏覽器快取shop

20.asp.net的生命週期

21.asp.net**的發布以及除錯晉級

22.bs程式的本質

23.壓力測試我們的shop

1.fiddler必知必會

2.ie開發者工具必知必會

3.跨站指令碼防範

4.許可權欺騙防範

5.引數越界防範

6.會話劫持防範

7.csrf防範

8.盜鏈防範

9.靜態檔案的保護

將本文分享到:

qq空間

人人網開心網

msn谷歌

更多

多執行緒之向執行緒傳遞引數

建立物件,初始化物件中的一些值,然後在start 方法中呼叫該物件方法 通過lambda表示式 thread.start方法 static void count object iterations static void countnumbers int iterations prints thre...

C 多執行緒之建立多執行緒CreateThread

includehandle winapi createthread in opt lpsecurity attributes lpthreadattributes,in size t dwstacksize,in lpthread start routine lpstartaddress,in op...

C 多執行緒學習(四)帶引數的執行緒啟動

在很多應用下,我們想要執行乙個不帶有一定先決條件的任務,比如如下 using system using system.threading namespace threadtest 不帶引數的啟動方法 public void nonparameterrun i thread.sleep interva...