C# 5.0 异步编程

在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

转载于:https://www.cnblogs.com/LoveSuk/p/6168782.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值