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


咨詢
建站咨詢
