• [译] C# 5.0 中的 Async 和 Await (整理中...)


    C# 5.0 中的 Async 和 Await

    【博主】反骨仔    【本文】http://www.cnblogs.com/liqingwen/p/6069062.html

      伴随着 .NET 4.5 和 Visual Studio 2012 的 C# 5.0 ,我们可以使用的新的异步模式,这里涉及到 async 和 await 关键字。有许多不同点的观点,比起之前我们所看到的代码,它的可读性和实用性是否更加突出。我们将通过一个例子,看看它与当前的做法有何“与众不同”。

    线性代码与非线性代码

      大部分的软件工程师习惯于用线性的思维方式去编程,也许是从他们开始职业生涯的时候就被这样教导。当选择使用线性思维的方式去编写一个程序的时候,这意味着它的源码在阅读的时候有点像图 1 。这假定我们有一个订单系统将帮助我们从某处获取一批订单。

      

      就算文章从左或从右开始,我们还是习惯于从上往下阅读。如果有某些东西影响到了这块内容的顺序,我们将会感到很困惑,同时在这种问题的地方耗费更多的时间与精力,即便它没有这个必要。基于事件的应用程序通常拥有这些非线性的结构。

      基于事件的系统流程,它在触发的同时,期待返回结果,图2 很形象的表达了这点。初看这两个序列似乎区别不大,但如果我们假设GetAllOrders返回 void ,这样检索订单列表就不是那么直截了当了。

      不看实际的代码,我们认为线性方法处理起来更舒适,也不容易出错。在这种情况下,错误可能不是运行时的错误或者编译时的错误,而是在使用的时候出错:由于缺乏清醒的认识。

      基于事件的方法还有一个很大的优势,它让我们与使用基于事件的异步模式更相符。

     
      在你看到一个方法的时候,你会有种想弄明白该方法的冲动。这意味着如果有一个叫 ReloadOrdersAndRefreshUI 的方法,你会去想弄明白加载订单的情况,怎样把它加入到UI,和当方法结束的时候会发生什么事情。在基于事件的方法里,这实现起来比较难。
      另外一个好处是,只要在我们触发 LoadOrdersCompleted 事件时,我们就能够在 GetAllOrders 里编写异步代码,并返回到调用线程中去。

    介绍一种新的模式

      假设,我们在自己的系统上工作,系统使用上面提到过的 OrderHandler ,以及在实际中执行的是使用一个线性方法。为了模拟真实订单系统的一小部分,OrderHandler 和 Order 如下:

     1 class Order
     2 {
     3     public string OrderNumber { get; set; }
     4     public decimal OrderTotal { get; set; }
     5     public string Reference { get; set; }
     6 }
     7 class OrderHandler
     8 {
     9     private readonly IEnumerable<Order> _orders;
    10     public OrderHandler()
    11     {
    12         _orders = new[]
    13                 {
    14                     new Order {OrderNumber = "F1", OrderTotal = 100, Reference = "Filip"},
    15                     new Order {OrderNumber = "F1", OrderTotal = 100, Reference = "Filip"}
    16                 };
    17     }
    18     public IEnumerable<Order> GetAllOrders()
    19     {
    20         return _orders;
    21     }
    22 }
      因为我们在示例中不使用真实的数据源,我们可以为它增加点乐趣。这是关于异步编程的,我们想要在一个异步方式中请求一些东西。为了对此模拟,我们简单的加入:
    1 System.Threading.ManualResetEvent(false).WaitOne(2000) in GetAllOrders:
    2 public IEnumerable<Order> GetAllOrders()
    3 {
    4     System.Threading.ManualResetEvent(false).WaitOne(2000);
    5     return _orders;
    6 }

    --整理中--


    【原文】http://www.dotnetcurry.com/csharp/869/async-await-csharp-dotnet

  • 相关阅读:
    nginx的tcp/udp代理
    centos7的systemd服务详解
    centos7下ssh服务登陆认证详解
    laravel实现敏感词汇过滤
    laravel使用阿里云短信发送消息
    laravel中使用极光推送消息
    gitlab与jenkins结合构建持续集成
    gitlab的安装配置与简单使用
    centos7之firewalld防火墙的配置与使用
    使用码云,GitHub进行版本控制,并通过WebHook进行自动部署
  • 原文地址:https://www.cnblogs.com/liqingwen/p/6069062.html
Copyright © 2020-2023  润新知