辽宁省网站建设,免费舆情监测平台,腾讯广告投放推广平台,泰安人才网最新招聘信息并发#xff08;英文Concurrency#xff09;#xff0c;其实是一个很泛的概念#xff0c;字面意思就是“同时做多件事”#xff0c;不过方式有所不同。在.NET的世界里面#xff0c;处理高并发大致有以下几种方法#xff1a; 1#xff0c;异步编程 异步编程就是使用futu…并发英文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 namecheckcode/param
/// returns/returns
public async Taskstring 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(vvs.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(vvs.110).aspx。 5Actor模型 Scala有Akka其实微软研究院也推出了Orleans来支持了Actor模型的实现当然也有Akka.NET可用。Orleans设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDDEventSourcing/CQRS系统。 官方网站是http://dotnet.github.io/orleans/转载于:https://www.cnblogs.com/atree/p/Concurrency_Async.html