• 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

  • 相关阅读:
    Java类变量和成员变量初始化过程
    Linux命令学习笔记
    gitlab本地部署方法(ubuntu16.04+gitlab9.5.5)
    Hanoi塔
    求递归算法时间复杂度:递归树
    最大堆/最小堆
    Matlab中plot基本用法
    这是一篇叼炸天的博客
    c++ static理解
    经典排序算法+文件操作~c语言实现
  • 原文地址:https://www.cnblogs.com/LoveSuk/p/6168782.html
Copyright © 2020-2023  润新知