C#发展至今,已经从最初的1.0到了4.0版本,不如来回顾一下各个版本都带来了什么:
- 1.0版本 - 基本C#语法。
- 2.0版本 - 泛型的支持,CLR进行了升级,从根本上支持了运行时泛型。
- 3.0版本 - LINQ,添加了
from
/join
等类SQL关键字,添加了扩展函数,添加了编译期动态类型var关键字。
- 4.0版本 - dynamic关键字,CLR进行升级,加入DLR,开始对动态进行友好的支持。同时加入动态参数、参数默认值、泛型协变等特性。
可以看到,C#从诞生至今,经历2次CLR的升级,以及1次语法层面的扩展,其作为一个语言已经非常便利、强大。但是随着时代的发展,C#依旧在不断前进,而下一代C# vNext又即将诞生。每一代的C#都会在小的语法调整之外,带来一个震撼性的特性。从2.0的泛型、3.0的查询到4.0的动态,每一个版本的C#都有着一个主导的思想,而其他细节的改进和调整则是围绕着这个最基本的思想给予支持。
在这样一路明确的有且只有一个主导思想的升级路线上,下一代的C# vNext的核心思想又是什么呢?纵观当下的软件工程界,最热门的话题莫过于并行计算,为此C#早在4.0版本中就已经引入了Parallel Linq扩展,简化并行的开发。但是这远远不够,即便Parallel Linq已经提供了极大的便利,但其执行-回调模型依旧打破了编码人员以往对代码就是一行一行顺序执行的习惯思维。因此,C#
vNext的主导思想是在这之上再给予更多的进化,即C# vNext将着眼于:
异步
C# vNext为了将异步变得更为简单,引入了2个关键字,async和await,下面简单介绍下这2个关键字给我们的编程带来怎么样的改变。
以一个标准的逻辑为例:下载一个远程URI,并将内容输出在界面上,假设我们已经有了显示内容的方法:
void Display(string text) {
// 不管是怎么实现的
}
如果用标准的同步式写法,这代码相当之容易:
void ShowUriContent(string uri) {
using (WebClient client = new WebClient()) {
string text = client.DownloadString(uri);
Display(text);
}
}
当然这不是我们讨论的重点,同步方式会造成线程的阻塞,必须选择WebClient
下载完成才可以继续运行,如果这个过程在UI线程上执行,则会造成UI无响应的情况。同时网络是非常不可预测的外部条件,很可能因为网络状况不好导致程序长时间没有响应,显然不是我们希望得到的结果。
所以我们又有了异步的方案,.NET中最早的异常编程模式是Begin/End模式,不过WebClient
作为WebRequest
的高层封装,已经把这个模式给封装了:
void DownloadUri(string uri) {
using (WebClient client = new WebClient()) {
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(ShowContent);
client.DownloadStringAsync(uri);
}
}
void ShowContent(object sender, DownloadStringCompletedEventArgs e) {
Display(e.Result);
}
看看,好好的事情一变成异步,就变得麻烦无比。一个很明确逻辑的方法活生生拆成2个来处理,虽然可以用Lambda或者delegate来使代码上进行简化,但依旧无可避免一段逻辑被拆成两段的痛苦。当更多的异步操作交叉在一起的时候,无论是代码的组织还是逻辑的梳理都会变得更加麻烦。
正因为如此,C# vNext引入了关键了,从语法上对此进行了改进,当使用async和await时,我们的代码会变成这样:
void async ShowUriContent(string uri) {
using (WebClient client = new WebClient()) {
string text = await client.DownloadStringTaskAsync(uri);
Display(text);
}
}
悄悄地告诉你,我写上面这段代码的时候,是直接把同步方案的代码复制过来再稍微发了几个字符的……由此可见,在语言级别给予支持后,代码的编写将会是如何地顺畅和简便。这段代码看上去就是一段典型的同步逻辑,创建-下载-显示按部就班,唯一不同地就是在方法声明中加入了async关键字,在DownloadStringTaskAsync
方法的调用时加入了await关键字。就这么神奇地,运行时变成了异步。ShowUriContent
方法会在调用DownloadStringTaskAsync
后退出,而下载过程会异步进行,当下载完成后,再进入Display
方法的执行,期间不会阻塞线程,不会造成UI无响应的情况。
虽然高手们总是说不要关心语言,不要在意语言,真正重要的是思想。但是看着这样的代码,真的还能认为语言的优秀与否对生产效率没有影响吗?
至于如何实现这个效果,本篇并不想做太多的说明,因为本文的目的仅仅是向大家介绍一下下一代C#的一个特性。实现机制方面,相信大家都想得到,编译器会将方法体在await关键字前后打断,编译为Begin/End模式的异步模型。这并不是什么难事,但是能想到并付诸于实施却并不容易。至少JAVA7虽然强化了异步编程,但却没有让语言达到这样的程度。请不要不屑于语法糖,正如高手们所说,无论什么语言都不见得能改变设计的代价,那么实现过程的效率,就决定了项目本身的生产效率。
说回来,这个思想和老赵的[Jscex](http://blog.zhaojie.me/tag/Jscex/ 老赵点滴 - 追求编程之美)非常类似,都是试图通过一步编译,将异步的编程模型统一为同步模型,简化开发复杂度,提升生产效率。时至如今,还想说中国的程序员搞不出创造性的东西吗?
PS1:怎么去体验下C# vNext。
- 装备好Visual Studio 2010 + SP1,无论什么版本。
- 把Visual Studio Async CTP下载下来,并安装。
- 建个项目,现在你已经可以使用async和await关键字了,而诸如
WebClient
下的DownloadStringTaskAsync
方法,则是在%MyDocument%\Microsoft
Visual Studio Async CTP\Samples\AsyncCtpLibrary.dll
下定义的扩展方法。
关于具体的实践和原理,可以看一看[C# 5.0 vNext - New Asynchronous Pattern](http://www.codeproject.com/KB/cs/async.aspx CodeProject)一文。
分享到:
相关推荐
众所周知C#提供Async和Await关键字来实现异步编程。在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await。 同样本文的内容也大多是翻译的,只不过加上了自己的理解进行了相关...
C#5.0 中async 和await 两个关键字,这两个关键字简化了异步编程
主要介绍了C#中的Async和Await用法,包括在C#5.0下一些新特性的影响,需要的朋友可以参考下
本篇文章主要介绍了说说C#的async和await的具体用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
经过一番的探索,终于搞清楚关键字async/await 在.net4.5之后可用的巧妙之处,在这里记录一下也与大家分享一下个人的心得体会 async:异步执行 await:异步执行中的等待其执行完(最大的优点是它是后台等待,因此不...
网上摘抄的简单实例,可能网上找得到。我这里就直接把代码弄出来 大家单步执行,既能知道async和await的用法
为文章 Async Await 异常处理 所写,主要展示四种典型情况下的异常处理。 async await; task.wait(); async 不 await; async void
确实,没有异步的多线程是单调的、乏味的,async和await是出现在C#5.0之后,它的出现给了异步并行变成带来了很大的方便。异步编程涉及到的东西还是比较多,本篇还是先介绍下async和await的原理及简单实现。 了解...
C# async await使用方法
C#异步方法的实现(async和await)入门示例
本篇文章主要介绍了浅谈Async和Await如何简化异步编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
韦_恩带你用好async/await异步多线程(C#5.0引入的特性)源码: 博文请参考地址: https://blog.csdn.net/qq_42539194/article/details/124025155?spm=1001.2014.3001.5501 网盘地址:...
主要是介绍Async,await实现异步的基本原理,介绍的应该是蛮清楚的
1.采用background处理后台耗时程序,防止主线程阻塞,实时显示处理进度。 2.采用async_await 关键字实现异步程序编程,杜绝主线程处理耗时程序假死
主要介绍了关于async和await的一些误区实例详解,有助于更加深入的理解C#程序设计,需要的朋友可以参考下
Async和Await关键字是C#异步编程的核心。通过使用这两个关键字,你可以使用.NET Framework 或 Windows Runtime的资源创建一个异步方法如同创建一个同步方法一样容易。 接下来通过VS2013 创建一个基于.NET4.5的控制台...
本文主要介绍了C#中 Thread,Task,Async/Await,IAsyncResult的相关知识。具有一定的参考价值,下面跟着小编一起来看下吧