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

首頁 > 編程 > C# > 正文

C#編程高并發的幾種處理方法詳解

2020-01-24 00:22:01
字體:
來源:轉載
供稿:網友

并發(英文Concurrency),其實是一個很泛的概念,字面意思就是“同時做多件事”,不過方式有所不同。在.NET的世界里面,處理高并發大致有以下幾種方法:

1、異步編程

異步編程就是使用future模式(又稱promise)或者回調機制來實現(Non-blocking on waiting)。如果使用回調或事件來實現(容易callback hell),不僅編寫這樣的代碼不直觀,很快就容易把代碼搞得一團糟。

不過在.NET 4.5 及以上框架中引入的async/await關鍵字(在.NET 4.0中通過添加Microsoft.Bcl.Async包也可以使用),讓編寫異步代碼變得容易和優雅。通過使用async/await關鍵字,可以像寫同步代碼那樣編寫異步代碼,所有的回調和事件處理都交給編譯器和運行時幫你處理了,簡單好用。

使用異步編程有兩個好處:不阻塞主線程(比如UI線程),提高服務端應用的吞吐量。所以微軟推薦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、并行編程

并行編程的出現實際上是隨著CPU有多核而興起的,目的是充分利用多核CPU的計算能力。并行編程由于會提高CPU的利用率,更適合客戶端的一些應用,對于服務端的應用可能會造成負面影響(因為服務器本身就具有并行處理的特點,比如IIS會并行的處理多個請求)。我自己使用并行編程最多的場景是之前分析環境數據不確定度的時候,使用并行的方式計算蒙特卡洛模擬(計算上千次之后擬合),當然后來我使用泰勒級數展開來計算不確定度,沒有這么多的計算量就無需并行了。當然在計算多方案結果比較的情況下,還是繼續使用了并發計算。

在.NET中,并行的支持主要靠.NET 4.0引入的任務并行庫和并行LINQ。通過這些庫可以實現數據并行處理(處理方式相同,輸入數據不同,比如我上面提到的應用場景)或者任務并行處理(處理方式不同,且數據隔離)。通過使用并行處理庫,你不用關心Task的創建和管理(當然更不用說底層的線程了),只需要關注處理任務本身就行了。

具體的用法還是參考官方文檔

3、響應式編程

響應式編程最近成為了一個Buzzword,其實微軟6年前就開始給.NET提供一個Reactive Extensions了。一開始要理解響應式編程有點困難,但是一旦理解了,你就會對它的強大功能愛不釋手。簡單來說,響應式編程把事件流看作數據流,不過數據流是從IEnumable中拉取的,而事件流是從IObservable推送給你的。為什么響應式編程可以實現并發呢?這是因為Rx做到線程不可知,每次事件觸發,后續的處理會從線程池中任意取出一個線程來處理。且可以對事件設置窗口期和限流。舉個例子,你可以用Rx來讓搜索文本框進行延遲處理(而不用類似我很早的時候用個定時器來延遲了)。

要詳細了解Rx最好的方式就是瀏覽 IntroToRx.com 這個網站,當然還有官方文檔

4、數據流編程

數據流(DataFlow)編程可能大家就更陌生了,不過還是有些常用場景可以使用數據流來解決。數據流其實是在任務并行庫(TPL)上衍生出來的一套處理數據的擴展(也結合了異步的特性),TPL也是處理并行編程中任務并行和數據并行的基礎庫。

望文生義,TPL DataFlow就是對數據進行一連串處理,首先為這樣的處理定義一套網格(mesh),網格中可以定義分叉(fork)、連接(join)、循環(loop)。數據流入這樣的處理網格就能夠并行的被處理。你可以認為網格是一種升級版的管道,實際上很多時候就是被當作管道來使用。使用場景可以是“分析文本文件中詞頻”,也可以是“處理生產者/消費者問題”。

參考資料當然也是官方文檔。

5、Actor模型

Scala有Akka,其實微軟研究院也推出了Orleans來支持了Actor模型的實現,當然也有Akka.NET可用。Orleans設計的目標是為了方便程序員開發需要大規模擴展的云服務, 可用于實現DDD+EventSourcing/CQRS系統。

官方網站查看。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖州| 凤阳县| 海城市| 喀喇沁旗| 巨鹿县| 武胜县| 万年县| 华蓥市| 莱芜市| 固阳县| 泸水县| 利辛县| 安塞县| 偏关县| 平原县| 布拖县| 关岭| 突泉县| 罗城| 乌恰县| 东光县| 讷河市| 庆城县| 板桥市| 眉山市| 景宁| 白银市| 时尚| 九龙县| 新蔡县| 瑞昌市| 社会| 曲麻莱县| 柞水县| 博野县| 江北区| 章丘市| 东至县| 兴和县| 玉门市| 叶城县|