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

C# 5.0 中的 Async 和 Await

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

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

 

线性代码与非线性代码

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

  

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

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

  不看实际的代码,咱们认为线性方法处理起来更温馨,也不容易出错。在这种状况下,错误可能不是运行时的错误或者编译时的错误,而是在使用的时候出错:因为缺少清醒的认识。async

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

 

 

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

 

介绍一种新的模式

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

 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-dotnetcode

相关文章
相关标签/搜索