【博主】反骨仔 【本文】http://www.cnblogs.com/liqingwen/p/6069062.htmlhtml
大部分的軟件工程師習慣於用線性的思惟方式去編程,也許是從他們開始職業生涯的時候就被這樣教導。當選擇使用線性思惟的方式去編寫一個程序的時候,這意味着它的源碼在閱讀的時候有點像圖 1 。這假定咱們有一個訂單系統將幫助咱們從某處獲取一批訂單。編程
基於事件的系統流程,它在觸發的同時,期待返回結果,圖2 很形象的表達了這點。初看這兩個序列彷佛區別不大,但若是咱們假設GetAllOrders返回 void ,這樣檢索訂單列表就不是那麼直截了當了。異步
不看實際的代碼,咱們認爲線性方法處理起來更溫馨,也不容易出錯。在這種狀況下,錯誤可能不是運行時的錯誤或者編譯時的錯誤,而是在使用的時候出錯:因爲缺少清醒的認識。async
基於事件的方法還有一個很大的優點,它讓咱們與使用基於事件的異步模式更相符。異步編程
假設,咱們在本身的系統上工做,系統使用上面提到過的 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