欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年01月01日 09:56:52   作者:zock  
這篇文章主要為大家詳細(xì)介紹了C#編程高并發(fā)的幾種處理方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

1、異步編程

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

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

使用異步編程有兩個(gè)好處:不阻塞主線程(比如UI線程),提高服務(wù)端應(yīng)用的吞吐量。所以微軟推薦ASP.NET中默認(rèn)使用異步來(lái)處理請(qǐng)求。

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

/// <summary>
/// 使用異步Action測(cè)試異步模板消息接口
/// </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)實(shí)際上是隨著CPU有多核而興起的,目的是充分利用多核CPU的計(jì)算能力。并行編程由于會(huì)提高CPU的利用率,更適合客戶端的一些應(yīng)用,對(duì)于服務(wù)端的應(yīng)用可能會(huì)造成負(fù)面影響(因?yàn)榉?wù)器本身就具有并行處理的特點(diǎn),比如IIS會(huì)并行的處理多個(gè)請(qǐng)求)。我自己使用并行編程最多的場(chǎng)景是之前分析環(huán)境數(shù)據(jù)不確定度的時(shí)候,使用并行的方式計(jì)算蒙特卡洛模擬(計(jì)算上千次之后擬合),當(dāng)然后來(lái)我使用泰勒級(jí)數(shù)展開來(lái)計(jì)算不確定度,沒(méi)有這么多的計(jì)算量就無(wú)需并行了。當(dāng)然在計(jì)算多方案結(jié)果比較的情況下,還是繼續(xù)使用了并發(fā)計(jì)算。

在.NET中,并行的支持主要靠.NET 4.0引入的任務(wù)并行庫(kù)和并行LINQ。通過(guò)這些庫(kù)可以實(shí)現(xiàn)數(shù)據(jù)并行處理(處理方式相同,輸入數(shù)據(jù)不同,比如我上面提到的應(yīng)用場(chǎng)景)或者任務(wù)并行處理(處理方式不同,且數(shù)據(jù)隔離)。通過(guò)使用并行處理庫(kù),你不用關(guān)心Task的創(chuàng)建和管理(當(dāng)然更不用說(shuō)底層的線程了),只需要關(guān)注處理任務(wù)本身就行了。

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

3、響應(yīng)式編程

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

要詳細(xì)了解Rx最好的方式就是瀏覽 IntroToRx.com 這個(gè)網(wǎng)站,當(dāng)然還有官方文檔

4、數(shù)據(jù)流編程

數(shù)據(jù)流(DataFlow)編程可能大家就更陌生了,不過(guò)還是有些常用場(chǎng)景可以使用數(shù)據(jù)流來(lái)解決。數(shù)據(jù)流其實(shí)是在任務(wù)并行庫(kù)(TPL)上衍生出來(lái)的一套處理數(shù)據(jù)的擴(kuò)展(也結(jié)合了異步的特性),TPL也是處理并行編程中任務(wù)并行和數(shù)據(jù)并行的基礎(chǔ)庫(kù)。

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

參考資料當(dāng)然也是官方文檔

5、Actor模型

Scala有Akka,其實(shí)微軟研究院也推出了Orleans來(lái)支持了Actor模型的實(shí)現(xiàn),當(dāng)然也有Akka.NET可用。Orleans設(shè)計(jì)的目標(biāo)是為了方便程序員開發(fā)需要大規(guī)模擴(kuò)展的云服務(wù), 可用于實(shí)現(xiàn)DDD+EventSourcing/CQRS系統(tǒng)。

官方網(wǎng)站查看。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中l(wèi)abel內(nèi)容顯示不全、不完整的解決方法

    C#中l(wèi)abel內(nèi)容顯示不全、不完整的解決方法

    這篇文章主要介紹了C#中l(wèi)abel內(nèi)容顯示不全、不完整的解決方法,只需要把兩個(gè)屬性設(shè)置一下即可解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2015-06-06
  • C#讀寫INI文件的方法

    C#讀寫INI文件的方法

    這篇文章主要介紹了C#讀寫INI文件的方法,涉及C#讀寫ini文件的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C# WebService創(chuàng)建、發(fā)布、調(diào)用的實(shí)例講解

    C# WebService創(chuàng)建、發(fā)布、調(diào)用的實(shí)例講解

    下面小編就為大家分享一篇C# WebService創(chuàng)建、發(fā)布、調(diào)用的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • WPF+SkiaSharp實(shí)現(xiàn)自繪拖曳小球

    WPF+SkiaSharp實(shí)現(xiàn)自繪拖曳小球

    WPF的拖曳效果,基本配置一下,就可以了,但是自繪的話,就得自己控制。本文將利用WPF+SkiaSharp實(shí)現(xiàn)自繪拖曳小球,感興趣的可以動(dòng)手嘗試一下
    2022-07-07
  • C#如何讓winform程序中的輸入文本框保留上次的輸入

    C#如何讓winform程序中的輸入文本框保留上次的輸入

    這篇文章主要介紹了C#如何讓winform程序中的輸入文本框保留上次的輸入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • LINQ基礎(chǔ)之From和GroupBy子句

    LINQ基礎(chǔ)之From和GroupBy子句

    這篇文章介紹了LINQ使用From和GroupBy子句的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#調(diào)用Oracle存儲(chǔ)過(guò)程的方法

    C#調(diào)用Oracle存儲(chǔ)過(guò)程的方法

    這篇文章主要介紹了C#調(diào)用Oracle存儲(chǔ)過(guò)程的方法,包含數(shù)據(jù)庫(kù)及C#對(duì)應(yīng)的調(diào)用代碼,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • C#實(shí)現(xiàn)餐飲管理系統(tǒng)完整版

    C#實(shí)現(xiàn)餐飲管理系統(tǒng)完整版

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)餐飲管理系統(tǒng)的完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C#匿名委托與Lambda表達(dá)式詳解

    C#匿名委托與Lambda表達(dá)式詳解

    這篇文章主要為大家詳細(xì)介紹了C#匿名委托與Lambda表達(dá)式的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C# Winform截圖指定控件范圍內(nèi)的圖像的流程步驟

    C# Winform截圖指定控件范圍內(nèi)的圖像的流程步驟

    工作所需,需要截圖軟件跑出來(lái)的界面上的圖表,但是窗口本身是可以縮放的,圖表也是做的可以跟著窗體大小一起縮放,所以就寫了一個(gè)函數(shù),用于截圖圖表容器內(nèi)的圖像,文中有函數(shù)源碼供大家參考,需要的朋友可以參考下
    2024-10-10

最新評(píng)論