執行緒池:
每乙個執行緒缺省會被分配
1mb的記憶體,在
c#中,這些都是實打實的分配的,當乙個執行緒啟動的時候,為了分配臨時堆疊大約需要花費幾百微秒的時間。
執行緒池通過迴圈利用執行緒可以讓你更高效的利用執行緒。
執行緒池就像外包的勞務隊一樣,有任務給他們,他們會管理勞務工的一切,你不需要去花時間去找單個勞務工,然後完成任務就解雇她,
對勞務隊而言,勞務工完成了你的這個任務,還是會回到自己的團隊中的,勞務工的管理也不需要你去負責,因為這由勞務隊處理了,
如果任務太多了,勞務隊會自己招乙個勞務工,如果還不夠就繼續招,但是如果任務比較少,而勞務工又比較多的話,對不起,勞務隊的管理人員就會解雇一部分勞務工了。
有很多方法可以進入執行緒池:
借助
task parallel library(framework 4.0)
呼叫
threadpool.queueuserworkitem
借助非同步委託。
借助
backgroundworker.
。
下面的一些構造間接的使用了執行緒池:
wcf,remoting,asp.net, asmx web services
應用程式。
system.timers.timer
和system.threading.timer.
framework
的一些非同步方法,例如
webclient
類,和大部分
begin***
方法。plinq
使用執行緒池的一些問題:
不可以設定乙個執行緒池執行緒的名字。
執行緒池執行緒全部都是後台執行緒。
阻塞乙個執行緒池執行緒可能會觸發建立乙個新執行緒,除非你呼叫
threadpool.setminthreads
方法。通過thread.currentthread.isthreadpoolthread
屬性可以查詢乙個執行緒是否是執行緒池執行緒。
實戰threadpool
1:通過
task
使用執行緒池:
public
static
void
mainthread()
static
string
downloadstring(
string
uri)
當查詢task.result的時候執行緒阻塞,等待task返回result。
2:通過
threadpool
.queueuserworkitem
public
static
void
mainthread()
static
void
go(object
data)
output:
hello from the thread pool!
hello from the thread pool! 123
3:借助委託的
begin***
方法:
public
static
void
mainthread()
static
intwork(
string
s) static
void
done(iasyncresult cookie)
在這裡將method當作引數進行傳遞後,在cookie的asyncstate中就可以使用傳遞的method了,
因為cookie.asyncstate型別是object,所以需要進行轉換,然後呼叫endinvoke方法來獲取結果。
深入淺出多執行緒系列之三 執行緒池
執行緒池 每乙個執行緒缺省會被分配 1mb的記憶體,在 c 中,這些都是實打實的分配的,當乙個執行緒啟動的時候,為了分配臨時堆疊大約需要花費幾百微秒的時間。執行緒池通過迴圈利用執行緒可以讓你更高效的利用執行緒。執行緒池就像外包的勞務隊一樣,有任務給他們,他們會管理勞務工的一切,你不需要去花時間去找單...
多執行緒系列(三) 執行緒池基礎
目錄 一 為什麼要使用執行緒池 執行緒池概念理解 備註 執行緒池中的執行緒是後台執行緒。1 為什麼會有執行緒池?因為建立執行緒和銷毀執行緒相對來說需要消耗大量的時間和資源。太多的執行緒會浪費記憶體。2 執行緒池是什麼?執行緒池就是乙個可持續性發展的執行緒集合,執行緒池內部維護著乙個訊息佇列。當一條方...
深入淺出多執行緒系列之二 關於Thread的那些事
1 你可以呼叫執行緒的例項方法join來等待乙個執行緒的結束。例如 public static void mainthread static void go 在列印了 1000個y 之後,後面就會輸出 thread t has ended 你可以在呼叫 join 方法的時候給它乙個 timeout ...