[首页]
[文章]
[教程]
首页
Web开发
Windows开发
编程语言
数据库技术
移动平台
系统服务
微信
设计
布布扣
其他
数据分析
首页
>
Web开发
> 详细
转 .NET4.5之初识async与await
时间:
2015-03-07 11:27:48
阅读:
435
评论:
0
收藏:
0
[点我收藏+]
来自:http://www.cnblogs.com/lekko/archive/2013/03/05/2944282.html 本人是从.NET4.0刚出的时候接触的.NET环境,所以学的东西就是4.0及其之前的。时代飞速前进,目测5.0也快出了吧,但一直也没去接受新的技术。最近由于要学习Web API,快看完了,却发现4.5已经大行其道了,于是又进行补脑。async与await便是其中之一: 这是两个关键字,用于异步编程。我们传统的异步编程方式一般是Thread、ThreadPool、BeginXXX、EndXXX等等。把调用、回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问题,在.NET 4.5中,新推出的async、await关键字,可以帮助我们像写同步方法一样去写异步方法(保证代码的整齐清晰)。 先来看个传统同步方法例子: 复制代码 1 static void Main(string[] args) 2 { 3 // 同步方式 4 Console.WriteLine("同步方式测试开始!"); 5 SyncMethod(0); 6 Console.WriteLine("同步方式结束!"); 7 Console.ReadKey(); 8 } 9 10 // 同步操作 11 private static void SyncMethod(int input) 12 { 13 Console.WriteLine("进入同步操作!"); 14 var result = SyancWork(input); 15 Console.WriteLine("最终结果{0}", result); 16 Console.WriteLine("退出同步操作!"); 17 } 18 19 // 模拟耗时操作(同步方法) 20 private static int SyancWork(int val) 21 { 22 for (int i = 0; i < 5; ++i) 23 { 24 Console.WriteLine("耗时操作{0}", i); 25 Thread.Sleep(100); 26 val++; 27 } 28 return val; 29 } 复制代码 可以从右图中看到执行结果,是非常典型的同步执行方法。 async关键字能用在方法、lambda表达式的声明部分,用来标示此方法可能包含await关键字,只有拥有async才能在其内部使用await关键字。异步方法可以具有Task、Task<>或void的返回类型;await关键字则是用于返回值是“可等待”类型(awaitable)的方法或lambda表达式内,“awaitable”可以是任何类型(常见的有Task、Task<>),它必须公开一个GetAwaiter() 方法并且返回有效的”awaiter”。更详细的信息可以参考“关于Async与Await的FAQ”,里面介绍了这些概念与注意事项。 当一个async方法,且内部包含await关键字,它就会在编译的时候成为一个异步方法,如果没有await关键字,则它将只会被当成一个同步方法来执行。如果对其内部实现感兴趣可以参考“异步性能:了解 Async 和 Await 的成本”一文,相信对深入了解这种机制还是有所帮助的。 现在我们尝试使用新出的异步关键字async、await来改造成异步调用: 复制代码 static void Main(string[] args) { // 异步方式 Console.WriteLine("\n异步方式测试开始!"); AsyncMethod(0); Console.WriteLine("异步方式结束!"); Console.ReadKey(); } // 异步操作 private static async void AsyncMethod(int input) { Console.WriteLine("进入异步操作!"); var result = await AsyncWork(input); Console.WriteLine("最终结果{0}", result); Console.WriteLine("退出异步操作!"); } // 模拟耗时操作(异步方法) private static async Task
AsyncWork(int val) { for (int i = 0; i < 5; ++i) { Console.WriteLine("耗时操作{0}", i); await Task.Delay(100); val++; } return val; } 复制代码 先来看结果吧,我们发现耗时操作已经是异步进行了。整体流程大概是先由Main函数异步调用AsyncMethod,并不等待AsyncMethod完成,继续往下执行。而AsyncMethod方式在被调用后,在分配到时间片时开始启动,执行函数体内容,并由于await AsyncWork语句而继续异步调用AsyncWork,但由于await关键字,将在此等待AsyncWork完成后,再继续往下执行。那么,AyncWork也一样的,被调用后,在分配到时间片时开始启动,执行耗时操作。 可以看到,使用了新的关键字后,同步与异步编程的语法差别进一步减少。随着.NET 4.5的推出,许多新类库和既有类库都支持这种新型的异步语法(比如HttpClient、HttpServer、MemoryStream...),它们以类似ReadAsync、WriteAsync、SendAsync等分开方法来提供具有async声明,且返回类型为Task、Task<>的异步工作方式。 补充: 刚才有朋友提到await Task.Delay(100)这条语句,这是为了让AsyncWork成为异步方法才加的,如果你要进行的操作不支持await修饰怎么办,其实很简单,使用Task.Factory.StartNew()就行了,举例: 复制代码 1 // 异步操作 2 private static async void AsyncMethod(int input) 3 { 4 Console.WriteLine("进入异步操作!"); 5 var result = await Task.Factory.StartNew((Func
)SyncWork2, input); 6 Console.WriteLine("最终结果{0}", result); 7 Console.WriteLine("退出异步操作!"); 8 } 9 10 // 模拟耗时操作(同步方法) 11 private static int SyncWork2(object input) 12 { 13 int val = (int)input; 14 for (int i = 0; i < 5; ++i) 15 { 16 Console.WriteLine("耗时操作{0}", i); 17 Thread.Sleep(100); 18 val++; 19 } 20 return val; 21 } 复制代码 这样,我们的SyncWork2实际上却是异步执行的,所得结果与前面的异步方法一致,只是这样一来输入参数只能是object类型,需要进行类型转化。另外,除了StartNew,我们还可以新建一个Task,然后调用Run,以完成同样效果。 目前来说,这种异步工作还是会造成本人使用上的不适,不过如果在将来的版本中,继续推广使用,相信不久便能熟练,且加快写代码的速度,编写出逻辑清晰的代码。
转 .NET4.5之初识async与await
原文:http://www.cnblogs.com/zuiyirenjian/p/4319916.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年09月23日 (328)
2021年09月24日 (313)
2021年09月17日 (191)
2021年09月15日 (369)
2021年09月16日 (411)
2021年09月13日 (439)
2021年09月11日 (398)
2021年09月12日 (393)
2021年09月10日 (160)
2021年09月08日 (222)
最新文章
更多>
2021/09/28 scripts
2022-05-27
vue自定义全局指令v-emoji限制input输入表情和特殊字符
2022-05-27
9.26学习总结
2022-05-27
vim操作
2022-05-27
深入理解计算机基础 第三章
2022-05-27
C++ string 作为形参与引用传递(转)
2022-05-27
python 加解密
2022-05-27
JavaScript-对象数组里根据id获取name,对象可能有children属性
2022-05-27
SQL语句——保持现有内容在后面增加内容
2022-05-27
virsh命令文档
2022-05-27
教程昨日排行
更多>
1.
list.reverse()
2.
Django Admin 管理工具
3.
AppML 案例模型
4.
HTML 标签列表(功能排序)
5.
HTML 颜色名
6.
HTML 语言代码
7.
jQuery 事件
8.
jEasyUI 创建分割按钮
9.
jEasyUI 创建复杂布局
10.
jEasyUI 创建简单窗口
友情链接
汇智网
PHP教程
插件网
关于我们
-
联系我们
-
留言反馈
- 联系我们:wmxa8@hotmail.com
© 2014
bubuko.com
版权所有
打开技术之扣,分享程序人生!