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

C#并發(fā)編程入門教程之概述

 更新時(shí)間:2019年03月11日 10:31:21   作者:艾心❤  
這篇文章主要給大家介紹了關(guān)于C#并發(fā)編程之概述的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

寫在前面

并發(fā)編程一直都存在,只不過過去的很長時(shí)間里,比較難以實(shí)現(xiàn),隨著互聯(lián)網(wǎng)的發(fā)展,人口紅利的釋放,更加友好的支持并發(fā)編程已經(jīng)成了主流編程語言的標(biāo)配,而對于軟件開發(fā)人員來說,沒有玩過并發(fā)編程都會有點(diǎn)不好意思。本系列文章將會以C#語言為主,詳細(xì)介紹并發(fā)編程。

什么是并發(fā)編程,其實(shí)很簡單,并發(fā)編程就是在一臺處理器上同時(shí)做多件事情,并發(fā)編程的目標(biāo)就是充分利用處理器的每一個(gè)核,以達(dá)到最高的處理性能。舉個(gè)例子,服務(wù)器在響應(yīng)第一個(gè)請求的同時(shí)響應(yīng)第二個(gè)請求。

關(guān)于并發(fā)編程的幾個(gè)誤解

誤解一:并發(fā)編程就是多線程

實(shí)際上多線只是并發(fā)編程的一中形式,在C#中還有很多更實(shí)用、更方便的并發(fā)編程技術(shù),包括異步編程、并行編程、TPL數(shù)據(jù)流、響應(yīng)式編程等。

誤解二:只有大型服務(wù)器程序才需要考慮并發(fā)

服務(wù)器端的大型程序要響應(yīng)大量客戶端的數(shù)據(jù)請求,當(dāng)然要充分考慮并發(fā)。但是桌面程序和手機(jī)、平板等移動端應(yīng)用同樣需要考慮并發(fā)編程,因?yàn)樗鼈兪侵苯用嫦蜃罱K用戶的,而現(xiàn)在用戶對使用體驗(yàn)的要求越來越高。程序必須能隨時(shí)響應(yīng)用戶的操作,尤其是在后臺處理時(shí)(讀寫數(shù)據(jù)、與服務(wù)器通信等),這正是并發(fā)編程的目的之一。

誤解三:并發(fā)編程很復(fù)雜、必須掌握很多底層技術(shù)

C# 和 .NET 提供了很多程序庫,并發(fā)編程已經(jīng)變得簡單多了。尤其是 .NET 4.5 推出了全新的 async 和 await 關(guān)鍵字,使并發(fā)編程的代碼減少到了最低限度。

并發(fā)編程的方向

多線程

線程是一個(gè)獨(dú)立的運(yùn)行單元,是操作系統(tǒng)中能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它包含于進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)行單位。每個(gè)線程都有自己獨(dú)立的棧,但是與進(jìn)程內(nèi)的其他線程共享內(nèi)存。現(xiàn)在的.NET程序都維護(hù)了一個(gè)線程池,里面有著一定數(shù)量的工作線程,這些線程等待著執(zhí)行分配下來的任務(wù),線程池也可以隨時(shí)監(jiān)測線程的數(shù)量,以備開發(fā)者根據(jù)業(yè)務(wù)情況靈活處理。

并行編程

并行編程主要用于分解計(jì)算密集型的任務(wù)片段,并將其分配給多個(gè)線程。前提是,程序中的任務(wù)可以分割成多個(gè)相互獨(dú)立的任務(wù)塊,關(guān)鍵字是相互獨(dú)立,如果依賴太大,就不適合用并行編程。

并行編程利用CPU的空閑資源,充分提高了CPU的利用率,提高了系統(tǒng)的吞吐量。在大多數(shù)情況下,服務(wù)器本身就已經(jīng)具備了并行處理能力,當(dāng)通過編程進(jìn)行并行處理的時(shí)候,需要慎重,因?yàn)槭褂貌划?dāng)將會導(dǎo)致內(nèi)存溢出等風(fēng)險(xiǎn),同時(shí)也會因?yàn)檎加梅?wù)器資源而導(dǎo)致服務(wù)器本身的并行處理能力顯著下降,嚴(yán)重的時(shí)候回導(dǎo)致系統(tǒng)無法使用。所以在進(jìn)行編程的時(shí)候,盡量不要處理過長或者過短的任務(wù)。

并行處理分為數(shù)據(jù)并行和任務(wù)并行,其實(shí)他們都使用到了動態(tài)調(diào)整的分割算法,在任務(wù)分割后分配給工作線程??梢酝ㄟ^以下兩種方式實(shí)現(xiàn)并行編程,一種是Parallel.ForEach以及更加優(yōu)美的PLINQ,這是并行編程的推薦處理方式,并且它們自帶自動分配任務(wù)的算法,可以在運(yùn)行時(shí)進(jìn)行調(diào)整;

在編寫并行任務(wù)的時(shí)候,需要注意的是閉包所帶來的風(fēng)險(xiǎn)。因?yàn)殚]包捕獲的是引用而不是值,所以可以在不經(jīng)意間共享這些變量。一個(gè)比較好的處理就是,在使用閉包外的變量的時(shí)候,可以在閉包內(nèi)定義局部變量,用以規(guī)避閉包帶來的變量共享問題。

需要說明的是,線程池會根據(jù)需要增加線程數(shù)量,線程池采用的是工作竊取隊(duì)列,以盡可能的達(dá)到高效

異步編程

目前最常用的異步編程模型是TAB編程(基于任務(wù)的編程模式)。異步編程提高了響應(yīng)能力,也實(shí)現(xiàn)了可擴(kuò)展性。比較直觀的是,大家在處理Winform的時(shí)候遇到過界面卡死的情況,異步編程可以在程序運(yùn)行的過程中繼續(xù)相應(yīng)用戶的輸入,而不會導(dǎo)致界面卡死,并提高了提高服務(wù)器端應(yīng)用的TPS(Transactions Per Second)和 QPS (Queries Per Second)。

.NET4.5以后為異步編程引入了async和await關(guān)鍵字,async關(guān)鍵字加在方法聲明上,主要用來配合方法內(nèi)的await關(guān)鍵字,這兩個(gè)關(guān)鍵字的引入,使得C#在異步編程上更加優(yōu)雅。如下所示

 public async Task DelayAsync()
 {
 await Task.Delay(1000);
 }

異步編程的執(zhí)行流程一般是,當(dāng)系統(tǒng)運(yùn)行至await,會暫停,并可以捕捉到當(dāng)前的上線文,SynchronizationContext,如果該上線文為空,就會使用當(dāng)前的TaskScheduler,該方法也會在這個(gè)上線文中繼續(xù)執(zhí)行。代碼執(zhí)行完以后,會嘗試在原始的上下文中恢復(fù)運(yùn)行。

注意:運(yùn)行winform和asp.net請求時(shí)會采用UI上下文或者asp.net上下文,其他情況下則采用線程池上下文。

異步方法的等待方式有await,Task.Wait和Task<T>.Result。但是要避免是用Task.Wait和Task<T>.Result,因?yàn)樗麄冊赨I線程或者ASP.NET線程環(huán)境中會導(dǎo)致死鎖。這個(gè)地方需要說明一下死鎖問題

 public async Task DelayAsync()
 {
  await Task.Delay(1000);//捕捉當(dāng)前上下文,并試圖在已捕捉的上下文中繼續(xù)運(yùn)行
 }
 
 void Test()
 {
  Task task= DelayAsync();
  Task.Wait();//同步程序塊,正在等待異步方法完成=======阻塞線程
 }

UI或者asp.net的上下文每次只能同時(shí)運(yùn)行一個(gè)線程。Wait方法已經(jīng)阻塞了一個(gè)線程,所以在await的時(shí)候無法捕捉上下文。可以使用ConfigureAwait方法,設(shè)置參數(shù)continueOnCapturedContext為false。由此,可以帶來一個(gè)啟示,就是在線程池線程上使用ConfigureAwait(false),在用戶界面或接口代碼中再恢復(fù)過來。

異步編程中有一條重要的準(zhǔn)則就是,當(dāng)你使用了異步編程的時(shí)候,最好一直使用,也是為了防止死鎖。

優(yōu)化使用:

避免上線文延續(xù),延續(xù)任務(wù)過多會導(dǎo)致性能問題

如果一個(gè)async方法一個(gè)需要用到上下文一個(gè)不需要用到,可以考慮拆分為兩個(gè)async方法,這樣代碼組織也會更直觀。

寫到最后

以上只是提出了C#并發(fā)編程的引子,后面將會詳細(xì)介紹C#并發(fā)編程的知識點(diǎn)。當(dāng)然,C#并發(fā)編程還有其他內(nèi)容,比如響應(yīng)式編程和TPL數(shù)據(jù)流這些,我平時(shí)用的比較少,所以此處沒有再做介紹,有興趣的同學(xué)可以另外查看一下。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • C#實(shí)現(xiàn)將一個(gè)矩陣分解為對稱矩陣與反稱矩陣之和的方法

    C#實(shí)現(xiàn)將一個(gè)矩陣分解為對稱矩陣與反稱矩陣之和的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將一個(gè)矩陣分解為對稱矩陣與反稱矩陣之和的方法,較為詳細(xì)的分析了矩陣分解運(yùn)算的原理與C#實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-08-08
  • c#深拷貝文件夾示例

    c#深拷貝文件夾示例

    這篇文章主要介紹了c#深拷貝文件夾示例,需要的朋友可以參考下
    2014-04-04
  • Chrome Visual Studio 2005下的編譯過程

    Chrome Visual Studio 2005下的編譯過程

    研究Chrome ,首先得把它編譯出來,這對于后續(xù)的代碼分析和閱讀有很大的幫助,想想自己編譯出一個(gè) Chrome 瀏覽器來使用,那是一件很炫的事情。
    2009-07-07
  • C#學(xué)習(xí)筆記之狀態(tài)模式詳解

    C#學(xué)習(xí)筆記之狀態(tài)模式詳解

    這篇文章主要為大家詳細(xì)介紹了C#學(xué)習(xí)筆記之狀態(tài)模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • C#純代碼實(shí)現(xiàn)打字游戲

    C#純代碼實(shí)現(xiàn)打字游戲

    這篇文章主要介紹了這篇文章主要為大家詳細(xì)介紹了C#純代碼實(shí)現(xiàn)打字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 深入理解C#之接口

    深入理解C#之接口

    這篇文章主要介紹了C#接口(Interface)用法,較為詳細(xì)的分析了C#中接口的功能、實(shí)現(xiàn)及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • C#實(shí)現(xiàn)順序隊(duì)列和鏈隊(duì)列的代碼實(shí)例

    C#實(shí)現(xiàn)順序隊(duì)列和鏈隊(duì)列的代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于C#實(shí)現(xiàn)順序隊(duì)列和鏈隊(duì)列的代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C#加解密之AES算法的實(shí)現(xiàn)

    C#加解密之AES算法的實(shí)現(xiàn)

    一般我們來說呢,對于加密,我們分為可逆和不可逆??赡婕用苡挚煞譃閷ΨQ加密(AES、DES等)和非對稱加密(RSA),還有就是一些編碼加密等(BASE64);不可逆的呢,大部分又都稱為摘要算法(MD5、SHA)。本文將用C#實(shí)現(xiàn)AES算法,需要的可以參考一下
    2022-08-08
  • 詳解C# ConcurrentBag的實(shí)現(xiàn)原理

    詳解C# ConcurrentBag的實(shí)現(xiàn)原理

    ConcurrentBag<T>實(shí)現(xiàn)了IProducerConsumerCollection<T>接口,該接口主要用于生產(chǎn)者消費(fèi)者模式下,可見該類基本就是為生產(chǎn)消費(fèi)者模式定制的。然后還實(shí)現(xiàn)了常規(guī)的IReadOnlyCollection<T>類,實(shí)現(xiàn)了該類就需要實(shí)現(xiàn)IEnumerable<T>、IEnumerable、 ICollection類
    2021-06-06
  • c#模擬js escape方法的簡單實(shí)例

    c#模擬js escape方法的簡單實(shí)例

    這篇文章主要介紹了c#模擬js escape方法的簡單實(shí)例,有需要的朋友可以參考一下
    2013-11-11

最新評論

塔城市| 化德县| 上思县| 北海市| 比如县| 化德县| 洛扎县| 博客| 搜索| 朝阳区| 德钦县| 镇坪县| 宽城| 鲜城| 潼关县| 沁水县| 观塘区| 古丈县| 敦化市| 石泉县| 辽阳县| 封开县| 洪洞县| 惠水县| 隆德县| 齐河县| 宜川县| 杭锦后旗| 教育| 南宫市| 余江县| 马龙县| 吴桥县| 大连市| 商河县| 镇原县| 沙田区| 达州市| 九龙县| 黄冈市| 平湖市|