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:
publicdelegate
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:
publicdelegate
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:
publicdelegate
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:
publicdelegate
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...