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

相關文章
相關標籤/搜索