C#編程高併發的幾種處理方法

来源:https://www.cnblogs.com/atree/archive/2017/12/31/Concurrency_Async.html
-Advertisement-
Play Games

併發(英文Concurrency),其實是一個很泛的概念,字面意思就是“同時做多件事”,不過方式有所不同。在.NET的世界裡面,處理高併發大致有以下幾種方法: 1,非同步編程 非同步編程就是使用future模式(又稱promise)或者回調機制來實現(Non-blocking on waiting)... ...


併發(英文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中預設使用非同步來處理請求。

 如果你看到這段文字,說明您正使用RSS閱讀或轉自《一棵樹-博客園》,原文地址:http://www.cnblogs.com/atree/p/Concurrency_Async.html 

例如:我用非同步做微信模板消息推送。

/// <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的創建和管理(當然更不用說底層的線程了),只需要關註處理任務本身就行了。

具體的用法還是參考官方文檔:https://msdn.microsoft.com/en-us/library/dd460693(v=vs.110).aspx

3,響應式編程

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

要詳細瞭解Rx最好的方式就是瀏覽 IntroToRx.com 這個網站,當然還有官方文檔:https://msdn.microsoft.com/en-us/data/gg577609。

4,數據流編程

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

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

參考資料當然也是官方文檔:https://msdn.microsoft.com/en-us/library/hh228603(v=vs.110).aspx。

5,Actor模型

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

官方網站是:http://dotnet.github.io/orleans/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2017即將過去,這幾天總想寫點什麼,記錄下這多事的一年。 17年對於我來說是意義非凡的一年,是歷經磨難的一年。這一年發生了很多事,是在20多年成長學習生涯中收穫最多的一年,也是做決定最多的一年。我的社會角色從一個學生變成了一個職場人仕。生活狀態從每天上學,放學,做作業過度到上班,下班,睡覺。對於這... ...
  • 1、Global.asax 文件包含響應 ASP.NET 或HTTP模塊所引發的應用程式級別和會話級別事件的代碼。 2、Global.asax.cs中的方法的含義: Application_Init:在每一個HttpApplication實例初始化的時候執行 Application_Disposed ...
  • 在說明垃圾回收的實現機制之前,先說明一下垃圾回收存在的背景。 垃圾回收器(GC)是.NET平臺中一個很重要的組成部分,.NET垃圾回收機制降低了編寫程式的複雜程度,使程式員不用耗費精力去處理析構,成功的將記憶體管理從程式的編寫時,脫離到運行時。 一、析構函數 析構函數的作用主要是釋放類在構造函數中以及 ...
  • 匿名方法是C# 2.0引入的新特性,用來為委托實例綁定方法。 應用場景:需要為委托實例綁定一個專用方法的時候,這就意味著匿名方法不可以被其它委托實例顯式引用。 聲明語法:委托類型 變數名 = delegate ( 參數列表 ) { 代碼塊 }; 示例代碼: 示例代碼解讀: 代碼運行結果: >>Hel ...
  • 因為您可以用,並且也是您的最佳選擇!之所以可用,是因為 C# 能夠很好地在 Mac、Linux、Android 和 iOS 上運行(對了,還有 Windows);它可以在您最喜愛的編輯器上運行;它在一個穩定的企業級平臺上經過了充分的時間驗證;最為重要的是:它是完全開源的!之所以是您的最佳選擇,是因為 ...
  • 運行完畢後刪除自己: public class DelSelf { /// <summary> /// 刪除自身,只刪除Application對象所取得的文件 /// </summary> /// <param name="args">刪除延時必須大於0,也不需太長,太小可能導致刪不掉!請根據電腦 ...
  • 一、課程介紹 本次分享課程屬於《C#高級編程實戰技能開發寶典課程系列》中的第四部分,阿笨後續會計劃將實際項目中的一些比較實用的關於C#高級編程的技巧分享出來給大家進行學習,不斷的收集、整理和完善此系列課程!本高級系列課程適合人群如下: 1、有一定的NET開發基礎並對WebApi、Task、WebSo ...
  • 一、課程介紹 本次分享課程屬於《C#高級編程實戰技能開發寶典課程系列》中的第三部分,阿笨後續會計劃將實際項目中的一些比較實用的關於C#高級編程的技巧分享出來給大家進行學習,不斷的收集、整理和完善此系列課程!本次高級系列課程適合人群如下: 1、有一定的NET開發基礎並對Socket技術有一定瞭解和認識 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...