首页 > 技术文章 > C# 5.0 异步编程

LoveSuk 2016-12-13 10:16 原文

在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

推荐阅读