国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

細說.NET中的多線程(二線程池)

2019-11-14 13:52:39
字體:
供稿:網(wǎng)友

上一章我們了解到,由于線程的創(chuàng)建,銷毀都是需要耗費大量資源和時間的,開發(fā)者應(yīng)該非常節(jié)約的使用線程資源。最好的辦法是使用線程池,線程池能夠避免當(dāng)前進行中大量的線程導(dǎo)致操作系統(tǒng)不停的進行線程切換,當(dāng)線程數(shù)量到達了我們設(shè)置的上限,線程會自動排隊等待,當(dāng)線程資源可用時,隊列中的線程任務(wù)會依次執(zhí)行,如果沒有排隊等候的資源,線程會變?yōu)殚e置狀態(tài)。

使用ThreadPool來訪問線程池

這種做法可以讓我們不用那么復(fù)雜的去實現(xiàn)創(chuàng)建,重用線程的邏輯,但是也有一些限制,比如由他內(nèi)置的方法,我們不知道什么時候線程池里面的任務(wù)會結(jié)束,也不能獲取線程的返回值。為了解決這些問題,微軟引入了一個新的概念。

使用Task來訪問線程池

引入了Task之后,你可以用如下實現(xiàn)來替代ThreadPool

這些實現(xiàn)都是等價的。Task本身實現(xiàn)了很多ThreadPool不能做的事情。

使用Task來獲得線程的返回值

 

使用Task來等待線程結(jié)束

更多Task同步編程的使用,請參見(還沒寫,先給自己挖個坑O(∩_∩)O)。

異步委托

ThreadPool.QueueUserWorkItem沒有提供一種簡單的機制來獲取線程的返回值。異步委托解決了這個問題,支持了傳入一系列的參數(shù)。此外,異步委托中沒有處理的異常會很方便的在調(diào)用線程的重新拋出(在調(diào)用EndInvoke的時候),因此不需要顯示的處理。

通過異步委托來執(zhí)行任務(wù)主要分一下幾步:

  1. 初始化并聲明一個你想要執(zhí)行的委托
  2. 在委托上調(diào)用BeginInvoke,把返回值保存為IAsyncResult中

調(diào)用BeginInvoke不會阻塞當(dāng)前線程,因此你可以在調(diào)用完之后執(zhí)行其他你想要同步的操作

  1. 當(dāng)你需要獲取委托的返回值時,調(diào)用EndInvoke方法,把IAsyncResult傳入EndInvoke中

阻塞的方式執(zhí)行異步委托

 

EndInvoke主要做3件事: 1. 等待異步委托完成 2. 接收返回值 3. 把異步線程中未處理的異常在當(dāng)前線程中重新拋出。

非阻塞的方式執(zhí)行異步委托

你也可以在調(diào)用BeginInvoke的時候指定一個回調(diào)方法,這個方法會在異步委托結(jié)束的時候自動調(diào)用。這樣異步委托就像是一個后臺線程一樣自動執(zhí)行,不需要主線程等待。只需要在BeginInvoke的時候做一些額外的操作即可實現(xiàn)這種操作。

關(guān)于線程池

Jeffery在C# via CLR Chapter27中針對線程池的使用給出了一些建議。目前我們允許開發(fā)者來指定一個線程池的最大線程數(shù)。但是事實證明,我們往往不應(yīng)該為一個線程池指定線程的上限,否則可能會出現(xiàn)程序死鎖或者餓死的狀態(tài)。比如你可能設(shè)置了1000個線程,但是某一時刻正好有第1001個線程需要等待所有線程結(jié)束才能執(zhí)行,這種情況如果你限制了線程池線程的個數(shù),就會出現(xiàn)死鎖。從開發(fā)的另一個角度說,你也不應(yīng)該限制一個進程使用多少資源,比如一個進程可以使用多少內(nèi)存,使用多少帶寬.因此雖然目前你可以通過GetMaxThreads, SetMaxThreads,GetMinThreads,SetMinThreads ,GetAvailableThreads來進行線程個數(shù)的限制,但是他仍然不建議大家這樣做。這些限制可能會讓你的程序運行的更慢。

 

關(guān)于使用Task訪問線程池:

細說.NET中的多線程 (三 使用Task)

 


作者:獨上高樓
出處:http://www.survivalescaperooms.com/myPRogram/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉林市| 旌德县| 潞城市| 方城县| 肥东县| 永清县| 郑州市| 太保市| 吴江市| 浠水县| 乌拉特中旗| 瓦房店市| 天长市| 安仁县| 都兰县| 瓮安县| 大理市| 华坪县| 成安县| 泰州市| 克东县| 临湘市| 湘阴县| 青海省| 临泉县| 博爱县| 闵行区| 大荔县| 赤峰市| 富川| 文登市| 浦县| 赫章县| 玉屏| 黄大仙区| 新蔡县| 炉霍县| 临沧市| 沙雅县| 绥芬河市| 平凉市|