BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

微软缘何认为VB与C#需要异步语法

| 作者 Jonathan Allen 关注 529 他的粉丝 ,译者 张龙 关注 12 他的粉丝 发布于 2011年1月6日. 估计阅读时间: 5 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

在过去几年间,多线程编程已经成为了一个热门话题。虽然我们长久以来一直都希望能有高速响应的用户界面,但实现这个愿望的工具却迟迟不见踪迹。对于大多数框架(包括.NET程序员所使用的那些框架)来说,对用户界面的更新仍然局限于单独一个线程,同时,硬件制造商已经转向了多核来代替更快的CPU。

C#与VB一开始提供了非常简单的并发支持,这是通过对监视器与委托使用lock/SyncLock关键字来实现的,异步程序库通过这两个关键字实现异步编程。在随后的几个版本中,我们并没有看到这两种语言在异步领域有任何进展,微软的精力都放在其他领域上了。随着.NET 4.0的到来,情况有了很大的变化。.NET 4.0引入了3个新的程序库:Task Parallel Library(TPL)、Parallel LINQ以及Coordination Data Structures(CDS)。这些程序库构建在增强的语法之上,如lambda、closure以及LINQ,极大简化了多线程开发工作。但这些库也不是十全十美的。Parallel LINQ看起来没什么问题,而对TPL的异步调用依旧充满了坏味道,有时还会出错。

如今的异步模式的一个大问题在于他们组合的不好。每个异步操作都需要通过回调链接到下一个。但回调是无法组合的,每一步都是独立的函数,无法划分到常见的编码结构中,如循环、using或是try——catch块。

结果,大多数开发者实际上并没有使用异步模式。他们转向了并发的多线程,依赖于后台线程和手工同步。但这种方式也存在着问题。由于将线程浪费在了阻塞的I/O上,因此你失去了操作系统所提供的性能与可伸缩性的优势,比如说I/O Completion Ports,更不必说调度大量线程给内存带来的压力了。此外,你还可以使用单独一个线程和循环,这意味着每次I/O操作都得等到之前的操作完成后才能开始。

也就是说,我们按照这种方式编写代码已经有很长一段时间了,在大多数情况下都没什么问题。通常,计算机都有足够的速度和内存来处理对线程的草率使用,这使得将数据编排到UI线程变得不那么困难。那到底有什么变化呢?

有三件事:

首先是基础项目。Async CTP并非凭空出现的,它构建在之前的大量研究与产品项目基础之上。这包括了异步语言AxumTask Parallel Library(TPL)Reactive Extensions(Rx)以及F#的异步工作流。当这些工作全部完成后,VB/C#中的异步语法将成为下一步工作。

其次是参与的人。与很多研究项目会雇佣毕业生不同,Somasegar打造了一个由5个天才项目经理所构成的团队,他们负责构建语法,以此证明异步编程可以像同步编程一样简单。这些开发者是Avner Aharoni、Mads TorgersenStephen Toub、Alex Turner以及Lucian Wischik,他们都是.NET领域的名家。没有他们的协作与奉献,CTP是不可能出现的。

最后是Silverlight。除了是Flash的替代者以外,Silverlight还是微软移动战略中的重要棋子。除非开发游戏,否则不使用Silverlight是没法在Windows Phone 7上编写应用的。Sivlerlight并不支持异步的I/O操作。曾尝试将WPF代码移植到Silverlight上的开发者知道,Sivlerlight是不支持异步I/O操作的。你别无选择,只能使用异步模式。Lucian在其“Async CTP简介”一文中阐释了这么做是多么的复杂。

当然了,这可能意味着C#与VB应该支持异步语法。如果这在C# 5/VB 11中真的发生了,那么一旦发现语义不正确就没机会再移除掉了。这需要以牺牲其他特性作为代价,从“编译器即服务(compiler-as-a-service)”到各种细小的特性。

查看英文原文:Why Microsoft Believes that VB and C# Need an Asynchronous Syntax

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

正是因为Silverlight没有同步IO功能 by Jeffrey Zhao

所以我现在写Silverlight基本只用F#了……

问题是微软还有没有机会? by soft SG

微软在各个领域不断的滞后,不晓得会不会轰然倒塌?

非要搞的这么复杂吗 by Yang Bob

MS的风格就是制造庞然大物~ 搞晕了别人,也搞晕了自己

Re: 非要搞的这么复杂吗 by 余 昭辉

没有变复杂吧,进一步简化了

Re: 问题是微软还有没有机会? by Jeffrey Zhao

有n个产品还是世界上卖的最好的(win, office),在落后的领域也在不断追赶(mobile, bing),又在某些领域不断创新(xbox, kinect),在我看来它倒塌的可能性不比google,apple之类的高多少嘛……

Re: 非要搞的这么复杂吗 by Jeffrey Zhao

简化了不是一点两点,是十二分地简化……

Re: 非要搞的这么复杂吗 by Jiang Kerry

await相对于Task.Wait只是语法上简化还是有其它改进?

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

7 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT