委託呼叫 子線程程呼叫 與執行緒池呼叫

2022-02-12 12:12:46 字數 3851 閱讀 7139

委託呼叫、子線程程呼叫、與執行緒池呼叫

1,委託呼叫

(1),同步委託:委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。

從下面的例子中可以看到,同步委託的執行是在主線程main中執行的,所以當執行委託時,當前工作會處於等待狀態,開始執行委託,當委託執行完後在繼續執行「當前工作」

public

delegate

intaddhandler(

inti,

inty);

private

void

button1_click(

object

sender, eventargs e)

intadd(

intx,

inty)

public

delegate

intaddhandler(

inti,

inty);

private

void

button1_click(

object

sender, eventargs e)

intadd(

intx,

inty)

輸出結果:ok

空  

debug.writeline(thread.currentthread.name) 輸出為空,看出非同步委託**執行是在我們沒有指定名字的新執行緒中執行的。

備註:由於非同步委託時啟用執行緒池執行緒執行,.net沒有賦予程式設計師直接停止其呼叫的方法,使得我們沒有辦法直接控制委託的停止和執行,假設 add是乙個0-100迴圈,一般情況下我們是沒有辦法 在委託迴圈到50讓委託停下來的,二般情況是可以通過一些特殊的手段的需要的話就goolge一下吧!所以顯得委託呼叫不夠靈活

下面給乙個一步委託返回值的列子:

public

delegate

intaddhandler(

inti,

inty);

private

void

button1_click(

object

sender, eventargs e)

intadd(

intx,

inty)

2,子執行緒呼叫:子執行緒的最大特點是在子執行緒執行任務時候,不占用主線程,而且我們可以自由控制它。visual c#中使用的執行緒都是通過自命名空間system.threading中的thread類經常例項化完成的。通過thread類的建構函式來建立可供visual c#使用的執行緒,通過thread中的方法和屬性來設定執行緒屬性和控制線程的狀態。以下thread類中的最典型的建構函式語法,在visual c#中一般使用這個建構函式來建立、初始化thread例項。        

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);

}

帶返回值的:

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);

}

3,執行緒池呼叫 :「執行緒池」是可以用來在後台執行多個任務的執行緒集合。這使主線程可以自由地非同步執行其他任務。

執行緒池通常用於伺服器應用程式。每個傳入請求都將分配給執行緒池中的乙個執行緒,因此可以非同步處理請求,而不會占用主線程,也不會延遲後續請求的處理。

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)

}

可以同樣用委託再委託的方法 呼叫帶有引數(或沒有任何引數)的方法
private

void

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