[译] 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 如下:

 class Order
{
public string OrderNumber { get; set; }
public decimal OrderTotal { get; set; }
public string Reference { get; set; }
}
class OrderHandler
{
private readonly IEnumerable<Order> _orders;
public OrderHandler()
{
_orders = new[]
{
new Order {OrderNumber = "F1", OrderTotal = , Reference = "Filip"},
new Order {OrderNumber = "F1", OrderTotal = , Reference = "Filip"}
};
}
public IEnumerable<Order> GetAllOrders()
{
return _orders;
}
}

  因为我们在示例中不使用真实的数据源,我们可以为它增加点乐趣。这是关于异步编程的,我们想要在一个异步方式中请求一些东西。为了对此模拟,我们简单的加入:

 System.Threading.ManualResetEvent(false).WaitOne() in GetAllOrders:
public IEnumerable<Order> GetAllOrders()
{
System.Threading.ManualResetEvent(false).WaitOne();
return _orders;
}

--整理中--


【原文】http://www.dotnetcurry.com/csharp/869/async-await-csharp-dotnet

[译] C# 5.0 中的 Async 和 Await (整理中...)的相关教程结束。

相关推荐:

Python自动化整理电脑垃圾_os.walk遍历与文件自动化删除

os.walk默认返回相对路径,需用os.path.join拼接完整路径并优先转为绝对路径;匹配文件应限定后缀、避开白名单;删除时须捕获PermissionError并处理;pathlib更适长路径但灵活性不如os.walk。 os.walk遍历出来的路径为什么总是相对路径? 默认情况下os.wal...

Python高频面试题分类汇总_系统整理

python面试核心考察变量赋值(引用传递)、可变/不可变对象区别(list/dict/set可变,tuple/str/int不可变)、字符串拼接效率(join优于+)、dict.keys()返回视图对象、is与==语义差异、legb作用域与闭包机制(需nonlocal)、__new__与__ini...

Python async与await原理_协程执行机制

async/await是基于事件循环的用户态协程机制,通过await显式让出控制权,协程对象需await或asyncio.run启动,暂停时保存栈帧,底层复用生成器机制,事件循环负责i/o轮询与协程调度。 Python的async与await不是线程或进程,而是一种用户态的协作式并发机制——协程(c...

Python async 与 await 底层机制解析

async/await是python对协程对象的显式标记和调度约定,asyncdef创建返回协程对象的函数,await作为挂起点要求操作对象实现await协议并在事件循环中让出控制权。 async与await不是线程,也不是协程的语法糖 它们是Python对协程对象(coroutineobject)...

Python await 背后到底发生什么

await是协程暂停并交还控制权给事件循环的协作式调度机制,依赖awaitable、事件循环和状态机协程三者配合;它非阻塞,本质是带语义的yield,仅适用于asyncdef函数。 当你写下await,Python并不是“暂停当前函数然后等结果回来”,而是把控制权交还给事件循环,让其他协程有机会运行...