我为什么喜欢用C#来做并发编程

来源:互联网 发布:oracle 执行sql脚本 编辑:程序博客网 时间:2024/05/17 01:07
我为什么喜欢用C#来做

魔法花园 - .NET版
新随笔订阅 管理
我为什么喜欢用C#来做并发编程


(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)


题记:就语言和运行时层面,C#做并发编程一点都不弱,缺的是生态和社区。


硅谷才女朱赟(我的家门)昨天发了一篇文章《为什么用 Java —— 关于并发编程》,让大家学习了Java中如何进行并发编程的一些基本知识。作为一个将近15年的.NET程序员,我觉得有必要给大家补充介绍一下C#进行并发编程的知识(当然不会太深入讲解)。这篇文章无意进行技术比较,毕竟技术只是工具(大同小异,各有千秋),主要还是看用工具的人。


并发(英文Concurrency),其实是一个很泛的概念,字面意思就是“同时做多件事”,不过方式有所不同。在.NET的世界里面,并发一般涉及如下几个方面:


多线程编程(已过时,不介绍)
异步编程
并行编程
响应式编程
数据流编程
为了支持以上编程,.NET提供了很多基础功能,比如:委托,匿名函数,Lambda表达式,线程池,Task模型,支持并发的集合(线程安全集合和不可变集合) ,调度器,同步功能。在这里,就不对这些内容进行介绍了,大家可以自行搜索学习。另外,对于Actor模型,.NET中也有支持,但我不认为它属于语言/运行时层面的并发,它更像架构层面的并发,我最后会简单介绍。


1,异步编程
异步编程就是使用future模式(又称promise)或者回调机制来实现(Non-blocking on waiting)。


如果使用回调或事件来实现(容易callback hell),不仅编写这样的代码不直观,很快就容易把代码搞得一团糟。不过在.NET 4.5(C# 5)中引入的async/await关键字(在.NET 4.0中通过添加Microsoft.Bcl.Async包也可以使用),让编写异步代码变得容易和优雅。通过使用async/await关键字,可以像写同步代码那样编写异步代码,所有的回调和事件处理都交给编译器和运行时帮你处理了。


使用异步编程有两个好处:不阻塞主线程(比如UI线程),提高服务端应用的吞吐量。所以微软推荐ASP.NET中默认使用异步来处理请求。


要详细了解异步编程,可以参考官方文档:https://msdn.microsoft.com/en-us/library/jj152938(v=vs.110).aspx和《Async in C# 5.0》这本书。另外,在这个官方文档中,微软还特意把异步编程分作了3种不同的模型:基于任务的模式(TAP)就是我上面推荐的这种,基于事件的模式(EAP)和异步编程模型(APM)我上面不推荐的事件和回调。


2,并行编程
并行编程的出现实际上是随着CPU有多核而兴起的,目的是充分利用多核CPU的计算能力。并行编程由于会提高CPU的利用率,更适合客户端的一些应用,对于服务端的应用可能会造成负面影响(因为服务器本身就具有并行处理的特点,比如IIS会并行的处理多个请求)。我自己使用并行编程最多的场景是之前分析环境数据不确定度的时候,使用并行的方式计算蒙特卡洛模拟(计算上千次之后拟合),当然后来我使用泰勒级数展开来计算不确定度,没有这么多的计算量就无需并行了。当然在计算多方案结果比较的情况下,还是继续使用了并发计算。


在.NET中,并行的支持主要靠.NET 4.0引入的任务并行库和并行LINQ。通过这些库可以实现数据并行处理(处理方式相同,输入数据不同,比如我上面提到的应用场景)或者任务并行处理(处理方式不同,且数据隔离)。通过使用并行处理库,你不用关心Task的创建和管理(当然更不用说底层的线程了),只需要关注处理任务本身就行了。


具体的用法还是参考官方文档:https://msdn.microsoft.com/en-us/library/dd460693(v=vs.110).aspx,当然《Parallel Programming with Microsoft .NET》这本书也行。


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/,善友也有介绍:http://www.cnblogs.com/shanyou/p/4295523.html


那么,我为什么喜欢使用C#来做并发编程呢?显而易见,有上面这些唾手可得的工具,使用C#同样可以轻易开发并发程序。


分享到: 更多 
分类: 运行时,设计模式
好文要顶 关注我 收藏该文    
朱永光
关注 - 1
粉丝 - 356
+加关注
5 0
« 上一篇:在.NET Core中使用MEF
» 下一篇:Build2016上值得一看的大数据相关Session
posted @ 2016-03-25 21:18 朱永光 阅读(3909) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。
最新IT新闻:
· 马云:希望阿里巴巴2036年成世界第五大经济体
· 裸机比iPhone 7还便宜!iPhone 8售价新曝:捆绑销售
· 纳德拉发新书《Hit Refresh》 :9月26日出版 收益全捐
· 阿里云收入暴涨:排名往前一下蹿了30名
· 不用等发布 你期待的iPhone 8将会是这样的
» 更多新闻...
最新知识库文章:
· 做到这一点,你也可以成为优秀的程序员
· 写给立志做码农的大学生
· 架构腐化之谜
· 学会思考,而不只是编程
· 编写Shell脚本的最佳实践
» 更多知识库文章...
公告
朱永光 


Follow me on Twitter 


在新浪微博上关注我 


关注我的微信订阅号“dotNET开发经验谈”
qrcode_for_gh_cb138e1e49c7_258
昵称:朱永光
园龄:13年4个月
粉丝:356
关注:1
+加关注
搜索


 找找看


 谷歌搜索
随笔分类
ABP(3)
ALM(5)
InfoQ(8)
Office及开发(8)
RIA(15)
Web开发(52)
Windows(4)
编程语言(27)
非技术(14)
管理与创业(2)
架构设计(6)
开发工具(30)
开发框架(6)
跨平台(11)
软件测试(7)
软件工程(2)
设计模式(6)
社区活动(19)
数据访问(12)
数据分析(7)
移动开发(7)
游戏开发(5)
云计算(16)
运行时(6)
桌面UI开发(9)
随笔档案
2017年9月 (1)
2017年3月 (1)
2017年2月 (1)
2016年12月 (2)
2016年11月 (3)
2016年10月 (4)
2016年9月 (2)
2016年8月 (1)
2016年6月 (2)
2016年4月 (2)
2016年3月 (8)
2016年2月 (3)
2016年1月 (5)
2015年12月 (3)
2015年10月 (2)
2015年9月 (2)
2015年8月 (4)
2015年7月 (8)
2015年6月 (19)
2015年5月 (29)
2015年4月 (30)
2015年2月 (1)
2014年11月 (1)
2013年11月 (1)
2013年10月 (2)
2013年9月 (1)
2013年7月 (1)
2013年1月 (1)
2012年10月 (1)
2012年8月 (1)
2012年4月 (2)
2012年3月 (2)
2011年12月 (1)
2011年7月 (2)
2011年4月 (3)
2011年3月 (1)
2010年12月 (1)
2010年11月 (1)
2010年10月 (1)
2010年9月 (1)
2010年8月 (1)
2010年7月 (2)
2010年6月 (1)
2010年5月 (3)
2010年3月 (4)
2010年2月 (1)
2010年1月 (2)
2009年12月 (5)
2009年10月 (2)
2009年7月 (1)
2009年6月 (3)
2009年5月 (7)
2009年2月 (1)
2009年1月 (1)
2008年12月 (3)
2008年9月 (2)
2008年7月 (3)
2008年6月 (4)
2008年5月 (1)
2008年4月 (3)
2008年3月 (2)
2008年2月 (2)
2008年1月 (1)
2007年12月 (1)
2007年11月 (3)
2007年10月 (1)
2007年9月 (1)
2007年8月 (6)
2007年7月 (3)
2007年6月 (3)
2007年5月 (6)
2007年4月 (7)
2007年3月 (4)
2007年1月 (1)
2006年12月 (1)
2006年11月 (1)
2006年10月 (1)
2006年9月 (3)
2006年7月 (1)
2006年6月 (1)
2006年5月 (1)
2006年4月 (1)
2006年2月 (3)
2006年1月 (2)
2005年12月 (1)
2005年9月 (1)
2005年6月 (1)
2005年5月 (2)
2005年4月 (1)
2005年3月 (3)
2005年1月 (3)
2004年12月 (1)
2004年11月 (5)
2004年10月 (1)
2004年8月 (1)
2004年7月 (8)
2004年6月 (1)
2004年5月 (2)
2004年4月 (3)
.NET技术
.NET Tools评测网
博客堂
技术Blog聚合器
朋友
TerryLee
蜡笔小王
晴天有雨
音乐
雅然
最新评论
1. Re:EF Core 1.0中使用Include的小技巧
性能怎么样 项目中还没有用过
--细血之舞
2. Re:使用VS2013、TFS2013和Git进行分布式团队协作
留名,以后备用
Git常用命令大全:
--最爱吃包子
3. Re:理解ASP.NET 5的中间件
赞永光,最近正在研究
--陈希章
4. Re:《WPF核心技术》(Essential WPF中译本)出版了
好书。
--okjulien
5. Re:一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3
太强了。
--hzc541800
阅读排行榜
1. Visual Studio 2013 发布正式版及使用感受(49921)
2. 使用VS2013、TFS2013和Git进行分布式团队协作(23062)
3. .NET Framework 4.6的新东西(16519)
4. 从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构(16116)
5. 执行后台任务的利器——Hangfire(13179)
Copyright ©2017 朱永光并发编程