[译] C# 5.0 中的 Async 和 Await (整理中...)
Posted 反骨仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[译] C# 5.0 中的 Async 和 Await (整理中...)相关的知识,希望对你有一定的参考价值。
C# 5.0 中的 Async 和 Await
【博主】反骨仔 【本文】http://www.cnblogs.com/liqingwen/p/6069062.html
线性代码与非线性代码
大部分的软件工程师习惯于用线性的思维方式去编程,也许是从他们开始职业生涯的时候就被这样教导。当选择使用线性思维的方式去编写一个程序的时候,这意味着它的源码在阅读的时候有点像图 1 。这假定我们有一个订单系统将帮助我们从某处获取一批订单。
基于事件的系统流程,它在触发的同时,期待返回结果,图2 很形象的表达了这点。初看这两个序列似乎区别不大,但如果我们假设GetAllOrders返回 void ,这样检索订单列表就不是那么直截了当了。
不看实际的代码,我们认为线性方法处理起来更舒适,也不容易出错。在这种情况下,错误可能不是运行时的错误或者编译时的错误,而是在使用的时候出错:由于缺乏清醒的认识。
基于事件的方法还有一个很大的优势,它让我们与使用基于事件的异步模式更相符。
介绍一种新的模式
假设,我们在自己的系统上工作,系统使用上面提到过的 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
以上是关于[译] C# 5.0 中的 Async 和 Await (整理中...)的主要内容,如果未能解决你的问题,请参考以下文章