C# 5.0 异步编程
2024-08-24 03:54:14
在C#5.0中,增加了一个强大的新功能--异步编程。( .NET FrameWork4.5 版本)
它以两个新型关键字出现:
- ·async
- ·await
1、Async方法有三种返回类型:
- async void :是一个“触发并忘记”的异步操作,最常见的应用场景是在async代码和其他代码的边界情况,比如UI事件处理必须返回void。
调用者不能等待任何返回结果,并且不能知道操作什么时候结束或者是否成功。
当你确定你不需要知道操作何时结束或者是否成功时,你应该使用void。
return statement只需要return;,并且是可选择。(不写也行)
- async Task:允许调用者等待操作结束的结果,并且传递在异步代码执行期间的异常。
当我们不需要任何返回类值时,一个async Task方法比async void方法更好,因为他允许调用者使用await去等待,并且处理异常更容易。
return statement只需要return;,并且是可选择的。(不写也行)
- async Task<T>:例如Task<string>,通常用于异步操作需要返回值的时候。
return必须有一个T类型的表达式,比如5+x,并且必须出现在方法所有路径的最后。
2、await try中可以使用,但不能在catch和finally中使用,我们可以通过以下方式解决
bool failed = false;
try
{
page = await webClient.DownloadStringTaskAsync("http://oreilly.com");
}
catch (WebException)
{
failed = true;
}
if (failed)
{
page = await webClient.DownloadStringTaskAsync("http://oreillymirror.com");
}
3、Async lambda表达式
C#是在大多数位置是不允许在Query表达式中使用await关键字的。是因为这些位置会被编译成lambda表达式,正因为如此,该lambda表达式需要标记为async关键字。
我们可以将他们转换,如下
IEnumerable<int> transformed = from x in alexsInts
where x != 9
select x + 2;
通过使用Linq内部带的拓展方法。然后lambda表达式变得明了可读,继而你也就可以标记他们为async,从而使用await了。
IEnumerable<Task<int>> tasks = alexsInts
.Where(x => x != 9)
.Select(async x => await DoSomthingAsync(x) + await DoSomthingElseAsync(x));
IEnumerable<int> transformed = await Task.WhenAll(tasks);
参考:中文转载 http://www.cnblogs.com/tdws/p/5617242.html
最新文章
- android手机登录时遇到“QQ安全登录发现病毒”解决
- ZooKeeper3.4.6配置
- 域用户直接登陆(C#,MVC)
- python模块与包加载机制
- linux ssh 无密码登陆
- socket基础(二)
- LESS文档
- 51 nod 1456 小K的技术(强连通 + 并查集)
- mysql之数据库的增删改查
- 巧用PHP中__get()魔术方法
- [Swift]LeetCode206. 反转链表 | Reverse Linked List
- Crazy Circuits HDU - 3157(有源汇有上下界最小流)
- C语言 &#183; 出栈次序
- SVN:项目管理工具
- Android的音频解码原来是直接调用的本地C方法直接通过硬件解码
- 用户说体验 | 关于阿里百川HotFix你需要了解的一些细节
- Unity3D笔记五 快捷键
- 树形DP求树的直径
- J-LINK序列号修改
- 数据分析侠A的成长故事