詳見例子 bvbus.com
c#多執行緒函式如何傳引數和返回值
提起多執行緒,不得不提起 委託(delegates)這個概念.
我理解的委託就是 具有 同樣引數和返回值 的函式的集合.
比如public delegate void mydelegate(int arg);
就是這種形式的函式 void myfuntion(int i); 的集合.
如何將乙個函式加入 委託 的集合?
mydelegate dele = new mydelegate(myfuntion1);
再增加乙個
dele += new mydelegate(myfuntion2);
...委託函式 dele 就是 具有整數引數和空返回值的函式 myfuntion1,2的集合.
呼叫這個委託函式
dele(1);
就是逐個呼叫 myfuntion1,2,...
一般執行緒函式的宣告和啟動
thread t = new thread(new threadstart(myfunction));
t.start();
正是呼叫了沒有引數和返回值的 委託函式 threadstart
其中的引數myfunction 是 這個委託函式中的一員.
很明顯 這樣無法傳引數和返回值,那我們該怎麼辦?
答案就在委託 的begininvoke() 方法上, begininvoke() 也是(非同步)啟動乙個新執行緒. 例如
mydelegate dele = new mydelegate (myfunction);
dele.begininvoke(10,"abcd");
void myfunction(int count, string str);
可以實現引數的傳遞.
如何收集執行緒函式 的 返回值?
與 begininvoke 對應 有個 endinvoke 方法,而且執行完畢返回 iasyncresult 型別的返回值.
這樣我們可以這樣收集 執行緒函式的 返回值
mydelegate dele = new mydelegate (myfunction);
iasyncresult ref = dele.begininvoke(10,"abcd");
...int result = dele.endinvoke(ref); <----收集 返回值
int myfunction(int count, string str); <----帶引數和返回值的 執行緒函式
一般來說,直接在子執行緒中對窗體上的控制項操作是會出現異常,這是由於子執行緒和執行窗體的執行緒是不同的空間,因此想要在子執行緒來操作窗體上的控制項,是不可能簡單的通過控制項物件名來操作,但不是說不能進行操作,微軟提供了invoke的方法,其作用就是讓子執行緒告訴窗體執行緒來完成相應的控制項操作。 現在用乙個用執行緒控制的程序條來說明,大致的步驟如下:
1. 建立invoke函式,大致如下: /// /// delegate function to be invoked by main thread ///
private void invokefun()
2. 子執行緒入口函式: /// /// thread function inte***ce ///
private void threadfun()
}3. 建立子執行緒:
thread thdprocess = new thread( new threadstart( threadfun ) );
thdprocess.start();
C 多執行緒函式如何傳引數和返回值
提起多執行緒,不得不提起 委託 delegates 這個概念 我理解的委託就是 具有 同樣引數和返回值 的函式的集合 比如public delegate void mydelegate int arg 就是這種形式的函式 void myfuntion int i 的集合.如何將乙個函式加入 委託 的...
c 多執行緒如何從執行緒返回值
public delegate void resultcallback int i public class a 被呼叫函式所在的類 public a resultcallback callback this.result callback private resultcallback result...
C 函式引數和返回值
在呼叫函式時,大多數情況下,函式是帶引數的。主調函式和被呼叫函式之間有資料傳遞關係。前面已提到 在定義函式時函式名後面括號中的變數名稱為形式引數 formal parameter,簡稱形參 在主調函式中呼叫乙個函式時,函式名後面括號中的引數 可以是乙個表示式 稱為實際引數 actual parame...