C# 5异步函数特性的一大好处是,它为异步提供了一致的方案。但如果在命名异步方法以及 触发异常等方面做法存在着差异,则很容易破坏这种一致性。微软因此发布了基于任务的异步模 式(Task-based Asynchronous Pattern,TAP),即提出了每个人都应遵守的约定。TAP有单独的文 件(http://mng.bz/B68W),MSDN中也有它的页面(http://mng.bz/4N39)。

  基于IO的操作会将工作移交给硬盘或其他计算机,这非常适合异步,而且没有明显的缺点。 CPU密集型的任务就不那么适合了。可以很轻松地将一些工作移交给线程池,在.NET 4.5中也要 比以前更加简单,这都要感谢 Task.Run 方法,但使用代码库来实现这一点,相当于为调用者做 了决定。不同的调用者可能会有不同的需求。如果仅仅暴露同步风格的方法,相当于为调用者提 供了灵活性,以保证其以最适合的方式进行工作。它们可以在需要时开始一个新任务,如果可以 接受当前线程在一段时间内忙于执行方法,也可以实现同步调用。

         public static async Task<int> ProcessRecords()
{
List<Record> records = await FetchRecordsAsync().ConfigureAwait(false);
//记录处理
await SaveResultsAsync(results).ConfigureAwait(false);
//让调用者知道处理了多少条记录
return records.Count;
}

  该方法大部分代码在线程池线程上执行。由于并没有要求在原始线程中执行,因此这正是我 们想要的结果。(专业术语叫做该操作没有线程亲和力(thread affinity)。)但这并不会影响调用 者,如果异步UI方法等待的是调用 ProcessRecords 的结果,则该异步方法将继续在UI线程上执 行。只有在 ProcessRecords 内部的代码声明其不关心执行上下文时,才会在线程池线程上执行。

  有争议的是,没有必要在第二个 await 表达式处调用 ConfigureAwait ,因为所剩工作已经 不多了,但通常来说我们应该在每个 await 表达式处调用该方法,而保持一致是个好习惯。如果 想为调用者提供方法执行上下文的灵活性,可将其作为异步方法参数。

  注意, ConfigureAwait 只会影响执行上下文的同步部分。而有关模拟(impersonation)等 其他部分,传播则并不关心,15.6.4节将详细介绍相关内容。

15.6.1 【Task使用】基于任务的异步模式的更多相关文章

  1. C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)

    学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是 ...

  2. 基于事件的异步模式(EAP)

    什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...

  3. Event-based Asynchronous Pattern Overview基于事件的异步模式概览

    https://msdn.microsoft.com/zh-cn/library/wewwczdw(v=vs.110).aspx Applications that perform many task ...

  4. C#基于任务的异步模式

    using System; using System.Threading; using System.Threading.Tasks; using static System.Console; //异 ...

  5. C# 基于任务的异步模式的创建与使用的简单示例

    对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法. 1.创建一个拥有异步方法的类 该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带A ...

  6. .NET 基于任务的异步模式(Task-based Asynchronous Pattern,TAP) async await

    本文内容 概述 编写异步方法 异步程序中的控制流 API 异步方法 线程 异步和等待 返回类型和参数 参考资料 下载 Demo 下载 Demo TPL 与 APM 和 EAP 结合(APM 和 EAP ...

  7. 【温故知新】C#基于事件的异步模式(EAP)

    在开发winform和调用asp.net的web service引用的时候,会出现许多命名为 MethodNameAsync 的方法. 例如: winform的按钮点击 this.button1.Cl ...

  8. 三、基于任务的异步模式(TAP),推荐使用

    一.引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用AP ...

  9. C#异步编程之基于任务的异步模式

    http://www.cnblogs.com/afei-24/p/6757361.html该文讲了基于任务的编程,这里再详细介绍一下.一.延续任务 private async static void ...

  10. 基于事件的异步模式——BackgroundWorker

    实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...

随机推荐

  1. SVN:通过命令行只提交目录,并忽略其中的文件

    通过SVN命令行,我们可以只提交项目的目录结构,从而绕开一开始就将我们不想要上传的文件给提交到服务器上.命令如下:svn add -N [directory] 之后可以进入此目录,执行以下命令:svn ...

  2. 查看scn headroom变化趋势的几种方法

    查看scn headroom变化趋势的几种方法 scn headroom问题,本文不做解释. 本文为自己的总结,脚本来自于oracle sr技术project师. 转载请注明出处http://blog ...

  3. HTML文档基础

    一.HTML(Hyper Text Markup Language超文本标记语言)是一种用来制作超文本文档的简单标记语言,HTML在正文的文本中编写各种标记,通过Web浏览器进行编译和运行才干正确显示 ...

  4. Java-JRE:JRE百科

    ylbtech-Java-JRE:JRE百科 JRE是Java Runtime Environment缩写,指Java运行环境,是Sun的产品.运行JAVA程序所必须的环境的集合,包含JVM标准实现及 ...

  5. 使用 Polyfill 而不再是 bable 来实践js新特性

    现状 我们想要用ES6 语法来写 JavaScript.然而由于我们需要兼容老版本的浏览器,那些浏览器不支持 ES6,我们需要解决这个问题. 有一个标准的做法是:写 ES6 代码 → 将所有代码编译成 ...

  6. bzoj2822[AHOI2012]树屋阶梯(卡特兰数)

    2822: [AHOI2012]树屋阶梯 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 879  Solved: 513[Submit][Status] ...

  7. Appium + python - automator定位操作

    # coding:utf-8from appium import webdriverfrom time import sleep desired_caps = { 'platformName': 'A ...

  8. C/C++中的绝对值函数

    --------开始-------- 对于不同类型的数据对应的绝对值函数也不相同,在c和c++中分别在头文件math.h 和 cmath 中. int : x = abs( n ) double : ...

  9. unity3D 使用欧拉角控制视野注意点

    变量声明: public PlayerInput p; //表示控制代码用来获得用户是否按下 public float rotateSpeed = 50f; //旋转速度 private GameOb ...

  10. weui&flexible布局

    1.weui 一开始以为只能用于小程序中,原来分两种:weui-wxss-master和weui-master.真的是强大的不得了,把设计好的样式和功能封装.然后分类,有明确的层级和逻辑,感动!!值得 ...