委託呼叫、子線程程呼叫、與執行緒池呼叫
1,委託呼叫
(1),同步委託:委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。
從下面的例子中可以看到,同步委託的執行是在主線程main中執行的,所以當執行委託時,當前工作會處於等待狀態,開始執行委託,當委託執行完後在繼續執行「當前工作」
public
delegate
intaddhandler(
inti,
inty);
private
void
button1_click(
object
sender, eventargs e)
intadd(
intx,
inty)
輸出結果:okpublic
delegate
intaddhandler(
inti,
inty);
private
void
button1_click(
object
sender, eventargs e)
intadd(
intx,
inty)
空
debug.writeline(thread.currentthread.name) 輸出為空,看出非同步委託**執行是在我們沒有指定名字的新執行緒中執行的。
備註:由於非同步委託時啟用執行緒池執行緒執行,.net沒有賦予程式設計師直接停止其呼叫的方法,使得我們沒有辦法直接控制委託的停止和執行,假設 add是乙個0-100迴圈,一般情況下我們是沒有辦法 在委託迴圈到50讓委託停下來的,二般情況是可以通過一些特殊的手段的需要的話就goolge一下吧!所以顯得委託呼叫不夠靈活
下面給乙個一步委託返回值的列子:
2,子執行緒呼叫:子執行緒的最大特點是在子執行緒執行任務時候,不占用主線程,而且我們可以自由控制它。visual c#中使用的執行緒都是通過自命名空間system.threading中的thread類經常例項化完成的。通過thread類的建構函式來建立可供visual c#使用的執行緒,通過thread中的方法和屬性來設定執行緒屬性和控制線程的狀態。以下thread類中的最典型的建構函式語法,在visual c#中一般使用這個建構函式來建立、初始化thread例項。public
delegate
intaddhandler(
inti,
inty);
private
void
button1_click(
object
sender, eventargs e)
intadd(
intx,
inty)
private輸出結果:void
button1_click(
object
sender, eventargs e)
void
add()
}
main
子執行緒0
子執行緒2
子執行緒3
從輸出結果我們 可以看到 ,新執行緒的執行,不會阻塞主線程。 我們可以通過 abort()方法結束執行緒。這裡就不給出**了。
下面說一下,帶引數的執行緒委託,看下面的**:
void
add(
intq)
}private
void
button1_click(
object
sender, eventargs e)
帶返回值的:private
void
button1_click(
object
sender, eventargs e)
));t.name ="
子執行緒";//
開始新執行緒
t.start();
debug.writeline(thread.currentthread.name);
}
3,執行緒池呼叫 :「執行緒池」是可以用來在後台執行多個任務的執行緒集合。這使主線程可以自由地非同步執行其他任務。private
void
button1_click(
object
sender, eventargs e)
));t.name ="
子執行緒";//
開始新執行緒
t.start();
//設定乙個迴圈來等待子執行緒結束
while
(t.threadstate
!=system.threading.threadstate.stopped)
debug.writeline(iresult.tostring());
debug.writeline(thread.currentthread.name);
}
執行緒池通常用於伺服器應用程式。每個傳入請求都將分配給執行緒池中的乙個執行緒,因此可以非同步處理請求,而不會占用主線程,也不會延遲後續請求的處理。
threadpool(執行緒池)是乙個靜態類,它沒有定義任何的構造方法(),我們只能夠使用它的靜態方法,這是因為,這是因為threadpool是託管執行緒池,是由clr管理的。
threadpool使用waitcallback委託,它所要做的工作是在後台進行的。使工作項的排隊和執行更容易,可以給工作者執行緒傳遞乙個狀態物件(提供資料)。狀態物件是私有的作用域位於執行緒層,所以不需要進行同步。
threadpool目標是為了減除執行緒的初始化開銷,實現並行處理。
乙個threadpool裡面註冊的執行緒擁有預設的堆疊大小,預設的優先順序。並且,他們都存在於多執行緒空間(multithreaded apartment)中。
threadpool中的thread不能手動取消,也不用手動開始。所以threadpool並不適用比較長的執行緒。你要做的只是把乙個waitcallback委託塞給threadpool,然後剩下的工作將由系統自動完成。系統會在threadpool的執行緒佇列中一一啟動執行緒。
當執行緒池滿時,多餘的執行緒會在佇列裡排隊,當執行緒池空閒時,系統自動掉入排隊的執行緒,以保持系統利用率。
我們的程式中使用threadpool來進行一些比較耗時或者需要阻塞的操作。當學要複雜的同步技術,例如事件,或需要對乙個現場表呼叫join方法時執行緒池就不能滿足需求了.在以下情況中不宜使用threadpool而應該使用單獨的thread
可以同樣用委託再委託的方法 呼叫帶有引數(或沒有任何引數)的方法private
void
button1_click(
object
sender, eventargs e)
//這裡加obj引數是為了適應委託格式 public delegate void waitcallback(object state)
//包含**方法要使用的資訊的物件。
void
add(
object
obj)
}
privatevoid
button1_click(
object
sender, eventargs e), "
111"
);
debug.writeline(thread.currentthread.name);
}void
add(
object
obj,
intq)
}
委託呼叫 子線程程呼叫 與執行緒池呼叫
委託呼叫 子線程程呼叫 與執行緒池呼叫 1,委託呼叫 1 同步委託 委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。從下面的例子中可以看到,同步委託的執行是在主線程main中執行的,所以當執行委託時,當前工作會處於等待狀態...
委託的呼叫方法與執行執行緒
委託在c 中可以看作是物件的一種新型別。一般情況下,我們經常把資料作為引數傳遞給某個方法,但有時某個方法執行的操作並不是指對資料進行操作,而是要對另乙個方法進行操作,這就需要使用委託了。委託典型的使用場合就是執行緒。當試圖啟動乙個執行緒時,使用的thread.start 方法就必須帶有乙個引數,該引...
執行緒 委託的非同步呼叫
c programming p323 begininvoke 會立即返回,它將建立乙個另乙個執行緒來完成自己的工作。當我需要它執行後的結果時 例如 pubilc delegate in testdetegate pubilc testdetegate thedetegate thedetegate ...