最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

異步/多線程/任務(wù)/并行編程之一:如何選擇合適的多線程模型?

 更新時間:2013年04月23日 09:36:12   作者:  
本篇文章小編為大家介紹,異步/多線程/任務(wù)/并行編程之一:如何選擇合適的多線程模型?需要的朋友參考下

異步、多線程、任務(wù)、并行編程之一:選擇合適的多線程模型

本篇概述:

@FCL4.0中已經(jīng)存在的線程模型,以及它們之間異同點;

@多線程編程模型的選擇。

 

1:異步、多線程、任務(wù)、并行的本質(zhì)

這四個概念對應(yīng)在CLR中的本質(zhì),本質(zhì)都是多線程。

異步,簡單的講就是BeginInvoke、EndInvoke模式,它在CLR內(nèi)部線程池進行管理;

多線程,體現(xiàn)在C#中,可以由類型Thread發(fā)起。也可以由ThreadPool發(fā)起。前者不受CLR線程池管理,后者則是。FCL團隊為了各種編程模型的方便,還另外提供了BackgroundWorker和若干個Timer,基本上它們都是ThreadPool的加強,增加了一些和調(diào)用者線程的交互功能;

任務(wù)(Task),為FCL4.0新增的功能,在一個稱之為任務(wù)并行庫(TPL)的地方,其實也就是System.Threading.Tasks命名空間下。任務(wù)并行庫名字取的很玄乎,其實它也是CLR線程池的加強。優(yōu)化了線程間的調(diào)度算法,增加了和調(diào)用者線程的交互功能;

并行(Parallel),為FCL4.0新增的功能,也屬于TPL。并行在后臺使用Task進行管理,說白了,因為Task使用的線程池線程,所以Parallel自然使用的也是線程池線程進行管理,它的本質(zhì)僅僅是進一步簡化了Task。在這里要增進一個對于并行的理解。實際上,多線程天然就是并行的。及時不用任務(wù)并行庫,用Thread類型新起兩個線程,CLR或者說Windows系統(tǒng)也會將這兩個線程根據(jù)需要安排到兩個CPU上去執(zhí)行。所以,并不是因為多了任務(wù)并行庫,CLR才支持并行計算,任務(wù)并行庫只是提供了一組API,使我們能夠更好的操縱線程進行并行開發(fā)而已。

2:遺憾

Jeffrey Richter大叔說,微軟提供了這么多線程模型,是遺憾的,因為這制造了混亂。很多開發(fā)者都不知道該選用哪個類型來編寫自己的多線程代碼。我們對微軟總是又愛又恨,它總是不停的更新一些東西,逼迫我們不停的學(xué)習(xí)。但是也好,進步導(dǎo)致它不會過早死掉,讓我們徹底失掉飯碗。
C#剛出來的被人笑,現(xiàn)在它的很多語法特性已經(jīng)比Java優(yōu)美。很多時候我們太擅長于嘲笑,以致最后只能哭。順便說一句,我依然是那么的喜歡JAVA,只是很久沒用它而已。

3:現(xiàn)在,該用什么來編寫多線程 

如果你在FRAMEWORK4.0下編寫代碼,那么應(yīng)該按照這個優(yōu)先級來撰寫多線程代碼: 

優(yōu)先

次優(yōu)先

不得以

Parallel(含擴展庫PLinq)

Task

ThreadPool(BackgroundWorker,Timer)

異步

Thread

這個表滿足了大部分情況下的一個優(yōu)先級指導(dǎo),但在某些情況下會有例外。

3.1:為什么 Parallel和Task優(yōu)先級一樣,而不是優(yōu)于Task?

Parallel雖然在后臺使用Task進行管理,并且它所謂簡化了對于Task的操作,但是它有一個重要的特征區(qū)別與Task:Parallel會阻滯調(diào)用者線程。查看Paralle的成員,有For、ForEach、Invoke方法,它甚至都沒提供一個BeginInvoke方法,也很好的暗示了這一點。不過雖然是同步的執(zhí)行的,Parallel還是會把多個任務(wù)分配到多個CPU上去。
Task被用的最多的是Start方法,它不會阻滯主線程。雖然Task也提供了同步的啟動線程的方法RunSynchronously,但一般用的不多。 

3.2:何時用異步,何時用線程或線程池

這需要從“IO操作的DMA(Direct Memory Access)模式”講起。通過DMA的數(shù)據(jù)交換幾乎可以不損耗CPU的資源。在硬件部分,硬盤、網(wǎng)卡、聲卡、顯卡等都有DMA功能??梢院唵蔚恼J(rèn)為,當(dāng)我們的工作線程需要操作I/O資源的時候(如讀取一個大文件、讀取一個網(wǎng)頁、讀取Socke包等),我們就需要用異步去做這些事情。異步模式只會在工作開始以及工作結(jié)束的時候占用CLR線程池,其它時候由硬盤、網(wǎng)卡等硬件設(shè)備來處理具體的工作,這就不會過多占用到CPU空間和時間損耗。 

概括而言:

計算密集型工作,直接采用線程;

IO密集型工作,采用異步機制;

當(dāng)我們不清楚什么工作是I/O密集型的,一個不是很恰當(dāng)?shù)闹笇?dǎo)就是:查看FCL類型成員,如果成員提供了類似BeginDosomething方法的,則優(yōu)先使用它,而不是新起一個線程或丟到線程池。

3.3:線程池的優(yōu)勢

新起線程,會帶來很大的開銷,這些開銷主要集中在:分配線程內(nèi)核對象、線程環(huán)境塊、用戶模式棧、內(nèi)核模式棧所需要的內(nèi)存空間,加載的DLL的DLLMain方法,并傳遞連接標(biāo)志,以及線程上下文切換。由于線程如此昂貴,所以對于普通的開發(fā)要求來說,線程池就是一個很好的選擇。線程池替開發(fā)人員管理工作線程,當(dāng)一項工作完畢的時候,CLR不會銷毀這個線程,而是會保留這個線程一段時間,看是否有別的工作需要這個線程。至于何時銷毀或新起線程,由CLR決定。


3.4:何時用Thread 
以上的各種線程模型,它們最終都是Thread。 那么什么時候需要Thread直接出場呢?

最重要的使用Thread的理由是,我們需要控制線程的優(yōu)先級。Thread之上的線程模型都不支持優(yōu)先級設(shè)置。設(shè)置一個線程的高優(yōu)先級可以使它獲得更多的CPU時間;

再者,可以控制線程為前臺線程。當(dāng)然,由Thread新起的線程默認(rèn)就是前臺線程。前臺線程不隨著調(diào)用者線程的中斷而中斷,這使得我們可以用Thread來進行一些關(guān)鍵性的操作。

相關(guān)文章

  • C#異步執(zhí)行任務(wù)的方法

    C#異步執(zhí)行任務(wù)的方法

    這篇文章主要介紹了C#異步執(zhí)行任務(wù)的方法,以一個簡單實例形式分析了C#異步執(zhí)行的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#聊天程序服務(wù)端與客戶端完整實例代碼

    C#聊天程序服務(wù)端與客戶端完整實例代碼

    這篇文章主要介紹了C#聊天程序服務(wù)端與客戶端完整實例代碼,很經(jīng)典的應(yīng)用,需要的朋友可以參考下
    2014-07-07
  • C#通過反射創(chuàng)建自定義泛型

    C#通過反射創(chuàng)建自定義泛型

    這篇文章主要介紹了C#通過反射創(chuàng)建自定義泛型的方法,需要的朋友可以參考下
    2014-08-08
  • C#可空類型用法分析

    C#可空類型用法分析

    這篇文章主要介紹了C#可空類型用法,實例分析了C#可空類型的功能、定義及使用方法,需要的朋友可以參考下
    2015-05-05
  • 解析C#網(wǎng)絡(luò)編程中的Http請求

    解析C#網(wǎng)絡(luò)編程中的Http請求

    這篇文章主要介紹了C#網(wǎng)絡(luò)編程中的Http請求,不過這次也使我對C#網(wǎng)絡(luò)編程了解的更多,算是一次學(xué)習(xí)經(jīng)歷吧,文章結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • C# WebService發(fā)布以及IIS發(fā)布

    C# WebService發(fā)布以及IIS發(fā)布

    這篇文章主要介紹了C# WebService發(fā)布以及IIS發(fā)布的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • WPF如何自定義TabControl控件樣式示例詳解

    WPF如何自定義TabControl控件樣式示例詳解

    這篇文章主要給大家介紹了關(guān)于WPF如何自定義TabControl控件樣式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • C#沉淀之委托的深入講解

    C#沉淀之委托的深入講解

    如果要給方法傳遞一個方法參數(shù)時,就可以使用委托。下面這篇文章主要給大家介紹了關(guān)于C#沉淀之委托的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • c# 日歷控件的實現(xiàn)

    c# 日歷控件的實現(xiàn)

    這篇文章主要介紹了c# 實現(xiàn)日歷的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • 詳解c# 類型轉(zhuǎn)換

    詳解c# 類型轉(zhuǎn)換

    這篇文章主要介紹了c# 類型轉(zhuǎn)換的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以學(xué)習(xí)
    2020-07-07

最新評論

綦江县| 宜宾市| 南阳市| 仁化县| 巢湖市| 项城市| 华容县| 海林市| 临沭县| 革吉县| 尖扎县| 安多县| 手机| 呼和浩特市| 张家港市| 罗城| 班戈县| 正阳县| 平谷区| 莱西市| 镇江市| 平塘县| 珲春市| 阿拉善左旗| 平度市| 汉中市| 土默特右旗| 乌审旗| 罗甸县| 迁西县| 沂水县| 石棉县| 永济市| 佛冈县| 迁西县| 罗田县| 太仆寺旗| 宜都市| 原阳县| 陆河县| 东乡族自治县|