目錄:
一、為什麼要使用執行緒池:執行緒池概念理解
備註:執行緒池中的執行緒是後台執行緒。
1、為什麼會有執行緒池?
因為建立執行緒和銷毀執行緒相對來說需要消耗大量的時間和資源。 太多的執行緒會浪費記憶體。
2、執行緒池是什麼?
執行緒池就是乙個可持續性發展的執行緒集合,執行緒池內部維護著乙個訊息佇列。
當一條方法名引用追加到執行緒池的佇列中,執行緒池會提取當前項,派發給執行緒池中空閒的執行緒。
3、執行緒池建立執行緒策略?
二、簡單的執行緒池操作
我們上面提到過,執行緒池內維護的了乙個訊息佇列,方法引用追加到佇列中,執行緒池中的執行緒從佇列中取出等待執行。
[securitysafecritical]public
static
bool queueuserworkitem(waitcallback callback);
[securitysafecritical]委託:public
static
bool queueuserworkitem(waitcallback callback, object state);
[comvisible(true所以,乙個是引數為null,乙個是需要傳遞實參的委託。要使用以上方式向佇列中新增工作項,其實是將方法引用新增到佇列中)]
public
delegate
void waitcallback(object state);
1、我們定義乙個符合 waitcallback 規則的委託 乙個引數且沒有返回值
public2、我們使用執行緒池進行非同步呼叫static
void workerfun(object
flag)
s", index);
thread.sleep(
2000
); }
console.writeline(
"【workerfun】end.");
}
public執行結果:void run(string
args)
console.writeline(
"【main】sleep 5s.");
thread.sleep(5000);
console.writeline(
"【main】end.
");
}
主線程執行完畢,子執行緒自動關閉。所以說,執行緒池中的執行緒都是後台執行緒,優先順序比較低。
二、執行上下文
1、為什麼要有執行上下文 ?
執行緒在執行**時,會受到上下文的影響。
上下文會從初始執行緒流向輔助線程,這樣這整個執行緒使用相同的安全設定和宿主設定。
同樣,輔助線程可以使用初始執行緒的邏輯上下文。
namespace system.threading
//通過執行上下文我們來控制上下文的流動。執行上下文
public
sealed
class
executioncontext : idisposable, iserializable
callcontext.logicalsetdata("執行:第一行允許流動;第二行禁止流動name
", "sc"
);//
預設允許上下文進行流動
threadpool.queueuserworkitem(state => console.writeline("
name=
", callcontext.logicalgetdata("
name
")));
//現在禁止流動
executioncontext.suppressflow();
threadpool.queueuserworkitem(state => console.writeline("
name=
", callcontext.logicalgetdata("
name
")));
//恢復流動
executioncontext.restoreflow();
console.readkey();
name=sc三、協作式取消和超時需要取消的模式必須顯示支援取消name=
//cancellationtokensource 管理 著取消相關的狀態.通知 system.threading.cancellationtoken,告知其應被取消
public
sealed
class cancellationtokensource : idisposable
所謂協作式,首先我自己要支援取消,接收訊號後任務終止。
private主線程中,接收協作式取消命令,子執行緒檢測到訊號後,主動停止。static
void count(system.threading.cancellationtoken token, int
countto)
", count);
if(token.iscancellationrequested)
",count);
break
; }}}
public執行結果:主線程發出回車訊號,子執行緒檢測到訊號後結束任務。void run(string
args)
多執行緒系列三 執行緒常用方法
獲取當前執行緒 currentthread 該方法返回執行currentthread 這個方法當前執行緒的資訊 返回的是thread例項 使用這個方法可以獲取執行緒的名稱等 下面來看一下比較複雜的例子 public class threadmethodtest override public voi...
深入淺出多執行緒系列之三 執行緒池
執行緒池 每乙個執行緒缺省會被分配 1mb的記憶體,在 c 中,這些都是實打實的分配的,當乙個執行緒啟動的時候,為了分配臨時堆疊大約需要花費幾百微秒的時間。執行緒池通過迴圈利用執行緒可以讓你更高效的利用執行緒。執行緒池就像外包的勞務隊一樣,有任務給他們,他們會管理勞務工的一切,你不需要去花時間去找單...
深入淺出多執行緒系列之三 執行緒池
執行緒池 每乙個執行緒缺省會被分配 1mb的記憶體,在 c 中,這些都是實打實的分配的,當乙個執行緒啟動的時候,為了分配臨時堆疊大約需要花費幾百微秒的時間。執行緒池通過迴圈利用執行緒可以讓你更高效的利用執行緒。執行緒池就像外包的勞務隊一樣,有任務給他們,他們會管理勞務工的一切,你不需要去花時間去找單...