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 (整理中...)的更多相关文章

  1. 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单

    一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两 ...

  2. 转:[你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单

    本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单  async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...

  3. [你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单

    本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单  async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...

  4. C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

  5. 四、C# 5.0 新特性——Async和Await使异步编程更简单

    一.引言 .NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就 ...

  6. 在MVC中使用async和await的说明

    首先,在mvc中如果要用纯异步请不要使用async和await,可以直接使用Task.Run. 其次,在mvc中使用async和await可以让系统开新线程处理Task的代码,同时不必等Task执行结 ...

  7. ES7中的async和await

    ES7中的async和await 在上一章中,使用Promise将原本的回调方式转换为链式操作,这就将一个个异步执行的操作串在一条同步线上了.下一次的操作必须等待当前操作的结束. 使用Promise的 ...

  8. async和await的使用总结 ~ 竟然一直用错了c#中的async和await的使用。。

    对于c#中的async和await的使用,没想到我一直竟然都有一个错误.. ..还是总结太少,这里记录下. 这里以做早餐为例 流程如下: 倒一杯咖啡. 加热平底锅,然后煎两个鸡蛋. 煎三片培根. 烤两 ...

  9. [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现

    9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分.C#8.0的新特性之一就是默认接口实现.在本文中,我们将一起来聊聊默认接口实现. 众所周知,对现有应用程序的接口 ...

随机推荐

  1. 先说IEnumerable,我们每天用的foreach你真的懂它吗?

    我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...

  2. Jenkins 安装的HTML Publisher Plugin 插件无法展示ant生成的JunitReport报告

    最近在做基于jenkins ant  junit 的测试持续集成,单独ant junit生成的junitreport报告打开正常,使用Jenkins的HTML Publisher Plugin 插件无 ...

  3. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

  4. JavaScript 对数据处理的5个API

    JavaScript对数据处理包括向上取整.向下取整.四舍五入.固定精度和固定长度5种方式,分别对应ceil,floor,round,toFixed,toPrecision等5个API,本文将对这5个 ...

  5. HTML 获取屏幕、浏览器、页面的高度宽度

    本篇主要介绍Web环境中屏幕.浏览器及页面的高度.宽度信息. 目录 1. 介绍:介绍页面的容器(屏幕.浏览器及页面).物理尺寸与分辨率.展示等内容. 2. 屏幕信息:介绍屏幕尺寸信息:如:屏幕.软件可 ...

  6. angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable

    大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...

  7. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  8. vue双向数据绑定原理探究(附demo)

    昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...

  9. 【Java大系】Java快速教程

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领 ...

  10. BPM协同平台解决方案分享

    一.需求分析 企业信息化的过程都是从单纯解决一个业务功能问题,到解决企业内部业务流程问题,再扩展到解决不同业务流程的关联互动问题, 核心是业务的集成和业务的协同,需要有一个统一的业务协同平台. 国内的 ...