新聞中心
線程池就是首先創(chuàng)建一些線程,它們的集合稱為線程池。使用線程池可以很好地提高性能,線程池在系統(tǒng)啟動時(shí)即創(chuàng)建大量空閑的線程,程序?qū)⒁粋€(gè)任務(wù)傳給線程池,線程池就會啟動一條線程來執(zhí)行這個(gè)任務(wù),執(zhí)行結(jié)束以后,該線程并不會死亡,而是再次返回線程池中成為空閑狀態(tài),等待執(zhí)行下一個(gè)任務(wù)。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),常寧企業(yè)網(wǎng)站建設(shè),常寧品牌網(wǎng)站建設(shè),網(wǎng)站定制,常寧網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,常寧網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
使用ThreadPool來訪問線程池
這種做法可以讓我們不用那么復(fù)雜的去實(shí)現(xiàn)創(chuàng)建,重用線程的邏輯,但是也有一些限制,比如由他內(nèi)置的方法,我們不知道什么時(shí)候線程池里面的任務(wù)會結(jié)束,也不能獲取線程的返回值。為了解決這些問題,微軟引入了一個(gè)新的概念。
使用Task來訪問線程池
引入了Task之后,你可以用如下實(shí)現(xiàn)來替代ThreadPool
這些實(shí)現(xiàn)都是等價(jià)的。Task本身實(shí)現(xiàn)了很多ThreadPool不能做的事情。
使用Task來獲得線程的返回值
使用Task來等待線程結(jié)束
更多Task同步編程的使用,請參見(還沒寫,先給自己挖個(gè)坑O(∩_∩)O)。
異步委托
ThreadPool.QueueUserWorkItem沒有提供一種簡單的機(jī)制來獲取線程的返回值。異步委托解決了這個(gè)問題,支持了傳入一系列的參數(shù)。此外,異步委托中沒有處理的異常會很方便的在調(diào)用線程的重新拋出(在調(diào)用EndInvoke的時(shí)候),因此不需要顯示的處理。
通過異步委托來執(zhí)行任務(wù)主要分一下幾步:
-
初始化并聲明一個(gè)你想要執(zhí)行的委托
-
在委托上調(diào)用BeginInvoke,把返回值保存為IAsyncResult中
調(diào)用BeginInvoke不會阻塞當(dāng)前線程,因此你可以在調(diào)用完之后執(zhí)行其他你想要同步的操作
-
當(dāng)你需要獲取委托的返回值時(shí),調(diào)用EndInvoke方法,把IAsyncResult傳入EndInvoke中
阻塞的方式執(zhí)行異步委托
EndInvoke主要做3件事: 1. 等待異步委托完成 2. 接收返回值 3. 把異步線程中未處理的異常在當(dāng)前線程中重新拋出。
非阻塞的方式執(zhí)行異步委托
你也可以在調(diào)用BeginInvoke的時(shí)候指定一個(gè)回調(diào)方法,這個(gè)方法會在異步委托結(jié)束的時(shí)候自動調(diào)用。這樣異步委托就像是一個(gè)后臺線程一樣自動執(zhí)行,不需要主線程等待。只需要在BeginInvoke的時(shí)候做一些額外的操作即可實(shí)現(xiàn)這種操作。
關(guān)于線程池
Jeffery在C# via CLR Chapter27中針對線程池的使用給出了一些建議。目前我們允許開發(fā)者來指定一個(gè)線程池的最大線程數(shù)。但是事實(shí)證明,我們往往不應(yīng)該為一個(gè)線程池指定線程的上限,否則可能會出現(xiàn)程序死鎖或者餓死的狀態(tài)。比如你可能設(shè)置了1000個(gè)線程,但是某一時(shí)刻正好有第1001個(gè)線程需要等待所有線程結(jié)束才能執(zhí)行,這種情況如果你限制了線程池線程的個(gè)數(shù),就會出現(xiàn)死鎖。從開發(fā)的另一個(gè)角度說,你也不應(yīng)該限制一個(gè)進(jìn)程使用多少資源,比如一個(gè)進(jìn)程可以使用多少內(nèi)存,使用多少帶寬.因此雖然目前你可以通過GetMaxThreads, SetMaxThreads,GetMinThreads,SetMinThreads ,GetAvailableThreads來進(jìn)行線程個(gè)數(shù)的限制,但是他仍然不建議大家這樣做。這些限制可能會讓你的程序運(yùn)行的更慢。
標(biāo)題名稱:.NET中的線程池的創(chuàng)建和使用
瀏覽地址:http://fisionsoft.com.cn/article/djephpd.html


咨詢
建站咨詢
