C# 5.0功能之Async一瞥
原文:
http://www.cnblogs.com/xiaomi7732/archive/2011/06/27/AsyncDemo.html
距离微软发布 Async CTP 已经有个把月了吧,周围大家都在热议着 Async 。如果你对 Async 已经非常熟悉,那么,请直接略过……如果你跟我一样,只会一点点异步编程,但又觉得以前的异步编程比较麻烦,那么,让我们一起来探索一下下一代的 C# 会给我们带来什么。( Async CTP 同样对 VB 有支持的。)
本文的例子基于 Async CTP SP1 Refresh 完成。由于 Async 还处于 CTP 阶段,很多东西还在讨论,因此,也许待到 C# 5.0 发布的时候,细节还会变动。但是,大体的思路,概念应该是不会有什么变化了。
进入正题:
首先,要试用 Async 功能,我们需要安装 Visual Studio 2010 SP1 和 Microsoft Visual Studio Async CTP (SP1 Refresh) 。
我们首先设定一个简单的任务,分别来看一下,同步编程,利用回调进步异步编程和 Async 编程的方法,然后来通过他们来分析一下, Async 到底是什么,它给我们带来了什么。
任务:
建立一个 Windows Form 应用程序,当点击按钮时,先显示一行字,例如,开始计算什么的,用以表示状态,然后计算从 1 到 int.Max/2 的累加,并把结果显示出来。
同步我们会这么做:
首先,写一个函数来实现基本算法:
#region Do things public long DoSomething( int n) |
然后,添加一个按钮的 Click 事件处理程序:
private void btnSync_Click( object sender, EventArgs e) |
代码第一行改写 Label 的字样;第二行调用算法获得结果;第三行把结果输出。看似挺不算的。运行一下,就会发现有两个问题:
- 这个算法需要四五秒钟左右的实现时间,并且在这几秒钟的时间里,界面是锁死的,也就是说应用程序就像死了一样,它不接受任何用户操作。(也许我的电脑比较差,呵呵,所以,如果你没有遇到这种情况,请加大输入参数的值,让它算一会儿。)
- 我们没有看到 Start to do something 这一行字。
OK ,出现这个现象也是可以理解的,因为我们把大量的运算添加到了 UI 线程里面了。所以,解决方法就是把它放到外面。我试了一下不用 Async ,实现的代码如下:
private void btnCallback_Click( object sender, EventArgs e) |
如果你觉得这段代码比较晕,那就跳过这一节吧。可能我代码写得不好,大家将就看我简单解释一下,我首先给 DoSomething 写了一个代理,然后,调用了代理的 BeginInvoke 方法,把算法放到了其它的 Thread 中去调用了。这个代理执行完了以后,因为它不会直接返回一个 long 型的值,而是会去执行一个 AsyncCallBack ,所以,就在这个 Callback 里,去调用这个代理的 EndInvoke() 。
好吧,且不论代码质量,这个就是有 Async 之前的一种实现异步的方法。
从这个代码里,我们完全看不到原来代码的影子,我也没有办法像解释同步代码一样解释:第一、第二、第三……有了 Async 之后呢?呵呵,代码说明一切:
public Task < long > DoSomethingAsync( int n) |
三件事:
第一:添加文件引用: AsyncCtpLibrary.dll 。相信 Async 正式发布之后,这个会出现在 .NET 应用程序集里。
第二:把 DoSomething 封装成一个 Task 。
第三:添加一些关键字,例如 async ,例如 await 。
我们来仔细看一下代码:
首先,我把要异步执行的代码的返回值写成 Task<T> 。这个返回值其实有三个选项: void , Task 和 Task<T> ,具体怎么用,大家查 MSDN 上 C#4.0 中的 Task 类吧。
然后,我调用了 TaskEx 中的 Run<long> 方法,传递给它一个返回值为 long 的方法——就是我们的任务的算法啦。
如果你有兴趣研究,可以看一下 Run<T> 其实调用了 Task.Factory.StartNew<T> ,而这个 Start<New> 则是先建了一个 Task ,然后调用了它的 Start 方法……
好,把算法封成任务部分完成。
第二部分代码比较容易解释了:
第一行改写 Label 的字样;第二行调用算法获得结果;第三行把结果输出。 <-- 本行复制 / 粘贴自前文 :-)
呵呵,让我们看看细一点,比较一下 Sync 和 Async 的代码:
Sync |
Async |
private void btnSync_Click( object sender, EventArgs e) |
private async void btnAsync_Click( object sender, EventArgs e) |
首先,我们在方法名上加上 async 修饰,声明这是一个有异步调用的方法;
然后,我们在返回 Task<T> 的函数调用( DoSomethingAsync )之前添加一个 await 关键字。来猜猜看 x 是什么类型的?答案是 long 型。有了 await 之后,即使在设计时,编译器会自动把 Task<T> 的类型,转换成 T 类型。
代码到这里结束了,但是,新的 Async 功能给我们带来了什么?是异步编程的能力吗?我们用 Callback 同样可以实现异步,而 IAsyncCallback 接口应该在 .NET 1.1 中已经实现了;多线程的命名空间也早就存在; Task 在 C# 4.0 中被引入……
我想, Async 给程序员带来的是一种代码逻辑为中心并且实现多线程编程的方式。通过最后的比较,我们看到, Async 的代码与 Sync 的代码相差无几,程序不再需要花大量精力去考虑回调、同步等等的问题……这与 C# 一直在努力的方向是一致的,程序员更多的来描述是什么而不是怎么做。
最后,附上应用程序下载和源代码,还有运行界面截图……(好吧,我不是美工,请原谅 :-) )
点击下载源代码
点击 Async ,看到运行提示:
![](/assets/blank.gif)
显示执行结果:
最新最官方的Async资料在这儿:^v^
http://msdn.microsoft.com/Async
Little knowledge is dangerous.
C# 5.0功能之Async一瞥相关推荐
- JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持
JAVA Web Servlet中的异步处理 (1) – Servlet3.0中的Async支持 每个请求来到Web容器,Web容器会为其分配一个线程来专门负责该请求,直到完成处理前,该执行线程都不会 ...
- 小评 XenServer 6.0功能
在整个x86虚拟化平台中,各大厂商也在持续的对自身的产品在性能上.功能上促进的完善.以VMware的vSphere 与Citrix XenServer以及Microsoft Hyper-V,当然还有R ...
- 鸿蒙os2.0系统什么时候,鸿蒙OS 2.0beta什么时候发布 鸿蒙OS2.0功能介绍
鸿蒙OS 2.0beta什么时候发布呢?华为发布了面向全场景的分布式操作系统 HarmonyOS 2.0,宣布年底面向开发者发布智能手机 Beta 版本,下面就让小编给大家介绍一下. 鸿蒙OS 2.0 ...
- C# 8.0 抢先看-- Async Stream
异步流? Async Stream 简单说来是一种非同步的迭代器模式,说更白一点就是可以await 的foreach.在过去的C# 中如果要回传一个可迭代的IEnumerable<T> , ...
- nacos配置ap_Nacos 1.0.0 功能预览
本文来自于我的个人主页:Nacos 1.0.0 功能预览,转载请保留链接 ;) Nacos 1.0.0 是正式 GA 的版本,在架构.功能和API设计上进行了全方位的重构和升级,1.0.0版本标志着N ...
- ADO.NET 2.0 功能一览
ADO.NET 2.0 功能一览 作者:Bob Beauchemin(DevelopMentor) 相关技术:ADO.NET 2.0.SQL Server 2005 难度:★★★☆☆ 读者类型:.NE ...
- 鸿蒙系统功能,华为HarmonyOS2.0系统功能都有哪些呢-华为鸿蒙系统HarmonyOS2.0功能介绍[图文]_咖绿茵手游站...
昨天晚上华为开了一个发布会,上面重点展示了自己鸿蒙系统的功能,让用户们去了解都有那些实用功能.那么华为HarmonyOS2.0系统功能都有哪些呢?下面小编给大家详细介绍下,还不清楚的小伙伴们快来看看吧 ...
- 安卓10和android区别,华为8月9日发布安卓10.0系统 华为EMUI 10.0功能及适配机型 华为安卓系统和鸿蒙OS区别...
华为8月9日发布安卓10.0系统 华为EMUI 10.0功能及适配机型 华为安卓系统和鸿蒙OS区别 根据最新消息显示,华为终端官方再次给出消息称,在8月9日华为开发者大会首天,他们将发布新一代基于An ...
- 神马笔记 版本2.2.0——功能优化
神马笔记 版本2.2.0--功能优化 一.目标 二.体验地址 三.功能优化 四.功能介绍 1. 关于神马笔记 2. 搜索笔记忽略大小写 3. 文件夹内容界面 4. 图片列表显示图片尺寸 五.新版本规划 ...
最新文章
- 审核中负利率加无现金社会 比特币将何去何从?
- javascript/jquery获取图片的原始大小
- linux多选项菜单脚本,linux shell 编写菜单脚本事例
- [漏洞检测]Proxpy Web Scan设计与实现(未完待续)
- 如何使用Burp Suite代理
- python ppt转pdf macos_Python批量将ppt转换为pdf
- Play项目的application.conf的配置
- (一)GPS与基站定位
- clientWidth,clientHeight 窗口宽高获取异常问题记录
- IP地址归属地查询算法
- 芬兰手游业25年发展史
- python若干整数的最大值_python脚本3_输入若干个整数打印出最大值
- deflate树与deflate编码
- 广州 Android 安卓培训一期视频+原课件代码
- 华为畅享10s值得买吗_达人解析华为畅享 10S好不好用?怎么样呢?真相揭秘必看...
- Unity5场景应该如何烘焙?
- R语言时间序列函数整理[不断更新]
- 常见IP碎片攻击详解
- JSP+Servlet+C3P0+Mysql实现的网上蛋糕店
- 设置电脑右下角显示秒钟
热门文章
- python使用xmindparser解析xmind文件并统计测试案例个数
- 六点创业术:从不对称的信息开始,以“白手起家挣一百万”结束
- GIS技巧100例—03 ArcGIS导入SketchUp模型
- 爱奇艺号微前端架构实践
- 2021RBR50机器人创新榜出炉,中国只有一家自动驾驶公司上榜
- 【C++】什么是函数对象和函数对象的用处
- 设置ImageView中图片的的颜色
- MybatisPlus主键技巧-@KeySequence type = IdType.INPUT 优先级高于setId(XXX) 业务主键的设置方式
- java websocket 认证_Websocket配置证书支持wss
- 天坑!python【numpy.int64和int类型转换】