C#編程高并發(fā)的幾種處理方法詳解
并發(fā)(英文Concurrency),其實是一個很泛的概念,字面意思就是“同時做多件事”,不過方式有所不同。在.NET的世界里面,處理高并發(fā)大致有以下幾種方法:
1、異步編程
異步編程就是使用future模式(又稱promise)或者回調(diào)機制來實現(xiàn)(Non-blocking on waiting)。如果使用回調(diào)或事件來實現(xiàn)(容易callback hell),不僅編寫這樣的代碼不直觀,很快就容易把代碼搞得一團糟。
不過在.NET 4.5 及以上框架中引入的async/await關(guān)鍵字(在.NET 4.0中通過添加Microsoft.Bcl.Async包也可以使用),讓編寫異步代碼變得容易和優(yōu)雅。通過使用async/await關(guān)鍵字,可以像寫同步代碼那樣編寫異步代碼,所有的回調(diào)和事件處理都交給編譯器和運行時幫你處理了,簡單好用。
使用異步編程有兩個好處:不阻塞主線程(比如UI線程),提高服務(wù)端應(yīng)用的吞吐量。所以微軟推薦ASP.NET中默認使用異步來處理請求。
例如:我用異步做微信模板消息推送。
/// <summary> /// 使用異步Action測試異步模板消息接口 /// </summary> /// <param name="checkcode"></param> /// <returns></returns> public async Task<string> TemplateMessageAsync(string openId, string first, string keyword1, string keyword2, string keyword3, string keyword4, string remark, string url) { if (openId == null) { return ReturnString(7771, "OPENID不能為空"); } else { var testData = new //TestTemplateData() { first = new TemplateDataItem(first), keyword1 = new TemplateDataItem(keyword1), keyword2 = new TemplateDataItem(keyword2), keyword3 = new TemplateDataItem(keyword3), keyword4 = new TemplateDataItem(keyword4), remark = new TemplateDataItem(remark) }; var result = await TemplateApi.SendTemplateMessageAsync(_wechat.APPID, openId, "m6td4jp_heMA5rhopbUaHApOlp2DD5x18BMXWKj3M5U", url, testData); return ReturnString(0, "成功"); } }
2、并行編程
并行編程的出現(xiàn)實際上是隨著CPU有多核而興起的,目的是充分利用多核CPU的計算能力。并行編程由于會提高CPU的利用率,更適合客戶端的一些應(yīng)用,對于服務(wù)端的應(yīng)用可能會造成負面影響(因為服務(wù)器本身就具有并行處理的特點,比如IIS會并行的處理多個請求)。我自己使用并行編程最多的場景是之前分析環(huán)境數(shù)據(jù)不確定度的時候,使用并行的方式計算蒙特卡洛模擬(計算上千次之后擬合),當然后來我使用泰勒級數(shù)展開來計算不確定度,沒有這么多的計算量就無需并行了。當然在計算多方案結(jié)果比較的情況下,還是繼續(xù)使用了并發(fā)計算。
在.NET中,并行的支持主要靠.NET 4.0引入的任務(wù)并行庫和并行LINQ。通過這些庫可以實現(xiàn)數(shù)據(jù)并行處理(處理方式相同,輸入數(shù)據(jù)不同,比如我上面提到的應(yīng)用場景)或者任務(wù)并行處理(處理方式不同,且數(shù)據(jù)隔離)。通過使用并行處理庫,你不用關(guān)心Task的創(chuàng)建和管理(當然更不用說底層的線程了),只需要關(guān)注處理任務(wù)本身就行了。
具體的用法還是參考官方文檔
3、響應(yīng)式編程
響應(yīng)式編程最近成為了一個Buzzword,其實微軟6年前就開始給.NET提供一個Reactive Extensions了。一開始要理解響應(yīng)式編程有點困難,但是一旦理解了,你就會對它的強大功能愛不釋手。簡單來說,響應(yīng)式編程把事件流看作數(shù)據(jù)流,不過數(shù)據(jù)流是從IEnumable中拉取的,而事件流是從IObservable推送給你的。為什么響應(yīng)式編程可以實現(xiàn)并發(fā)呢?這是因為Rx做到線程不可知,每次事件觸發(fā),后續(xù)的處理會從線程池中任意取出一個線程來處理。且可以對事件設(shè)置窗口期和限流。舉個例子,你可以用Rx來讓搜索文本框進行延遲處理(而不用類似我很早的時候用個定時器來延遲了)。
要詳細了解Rx最好的方式就是瀏覽 IntroToRx.com 這個網(wǎng)站,當然還有官方文檔
4、數(shù)據(jù)流編程
數(shù)據(jù)流(DataFlow)編程可能大家就更陌生了,不過還是有些常用場景可以使用數(shù)據(jù)流來解決。數(shù)據(jù)流其實是在任務(wù)并行庫(TPL)上衍生出來的一套處理數(shù)據(jù)的擴展(也結(jié)合了異步的特性),TPL也是處理并行編程中任務(wù)并行和數(shù)據(jù)并行的基礎(chǔ)庫。
望文生義,TPL DataFlow就是對數(shù)據(jù)進行一連串處理,首先為這樣的處理定義一套網(wǎng)格(mesh),網(wǎng)格中可以定義分叉(fork)、連接(join)、循環(huán)(loop)。數(shù)據(jù)流入這樣的處理網(wǎng)格就能夠并行的被處理。你可以認為網(wǎng)格是一種升級版的管道,實際上很多時候就是被當作管道來使用。使用場景可以是“分析文本文件中詞頻”,也可以是“處理生產(chǎn)者/消費者問題”。
參考資料當然也是官方文檔。
5、Actor模型
Scala有Akka,其實微軟研究院也推出了Orleans來支持了Actor模型的實現(xiàn),當然也有Akka.NET可用。Orleans設(shè)計的目標是為了方便程序員開發(fā)需要大規(guī)模擴展的云服務(wù), 可用于實現(xiàn)DDD+EventSourcing/CQRS系統(tǒng)。
官方網(wǎng)站查看。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C#訪問C++動態(tài)分配的數(shù)組指針(實例講解)
欄 目:C#教程
下一篇:基于C#的抽象類別詳解
本文標題:C#編程高并發(fā)的幾種處理方法詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5310.html
您可能感興趣的文章
- 01-10C#編程實現(xiàn)自定義熱鍵的方法
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10C#編程自學(xué)之數(shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之開篇介紹
- 01-10C#編程自學(xué)之數(shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運算符和表達式
- 01-10C#編程自學(xué)之類和對象
- 01-10C#圖片處理3種高級應(yīng)用
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程自學(xué)之數(shù)據(jù)類型和變量一


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載