[译] 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

posted @ 2016-11-16 12:42  反骨仔  阅读(1835)  评论(1编辑  收藏  举报