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. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  2. NodeJs之调试

    关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...

  3. 如何一步一步用DDD设计一个电商网站(二)—— 项目架构

    阅读目录 前言 六边形架构 终于开始建项目了 DDD中的3个臭皮匠 CQRS(Command Query Responsibility Segregation) 结语 一.前言 上一篇我们讲了DDD的 ...

  4. Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)

    Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...

  5. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  6. 【开源】.Net Aop(静态织入)框架 BSF.Aop

    BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...

  7. BPM配置故事之案例7-公式计算

    行政主管发来邮件.要求物资明细表增加"单价""总价"."单价"由其审批时填写,"总价"根据"单价"与 ...

  8. eclipse — 导入android项目后识别成java项目的问题及解决

    最近在eclipse导入android项目的时候遇到了奇葩问题,再此记录 遇到的问题就是:将完好的android项目导入到eclipse的时候,原本这是一个很容易的事情,但是导入成功后发现,,,靠ec ...

  9. ubuntu15.04 nginx1.6.5 配置虚拟主机

    1 在/etc/hosts   添加host 2 在/etc/nginx/nginx.conf中查看http里的include ****** /*.conf的路径,在此路径下添加一个新的******. ...

  10. SpringMvc中初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...