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. AngularJS:添加检查密码输入是否一致的功能

    感谢作者(http://blog.brunoscopelliti.com/angularjs-directive-to-check-that-passwords-match) 利用AngularJS的 ...

  2. Effective C++ 45-48

    45.弄清c++在幕后为你所写.所调用的函数. 假设设置一个空类,c++编译器会声明下面函数:拷贝构造函数.赋值运算符,析构函数,一对取地址运算符函数(const和非const).而假设你没有声明不论 ...

  3. URAL 1196. History Exam (二分)

    1196. History Exam Time limit: 1.5 second Memory limit: 64 MB Professor of history decided to simpli ...

  4. Project Euler:Problem 33 Digit cancelling fractions

    The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplif ...

  5. Linux(redhat 5.8)下 安装jetty 部署 使用

    首先须要安装JDK,自行解决 下载jetty安装包http://dist.codehaus.org/jetty/ 我下载的是8.1.15 tar -xzvf *.tar.gz 解压完之后,基本就能够用 ...

  6. C# 手动编写 DataSet,DataTable 及遍历DataSet中的数据

    一.手动编写DataSet:    有时候不想从数据库导出 DataSet,或者有其他的需要,要将数据库里的DataSet包装成另一个样子,这个时候,了解DataSet的内部结构就非常必要.DataS ...

  7. 自顶向下(递归)的归并排序和自底向上(循环)的归并排序——java实现

    归并排序有两种实现方式,自顶向下和自底向上.前者的思想是分治法,现将数组逐级二分再二分,分到最小的两个元素后,逐级往上归并,故其核心在于归并.后者的思想相反,采用循环的方式将小问题不断的壮大,最后变成 ...

  8. javascript--给你的JS代码添加单元测试

    通过测试框架为JavaScript应用添加测试,从而保证代码的高质量.这里的笔记例子应用在jaywcjlove/validator.js中. 安装 用到三个工具chai(断言工具),mocha(测试框 ...

  9. PCB拼板之单一矩形排样算法

    算法实现相关内容整理如下: 一.排样变量与关系 此算法,基于固定4边的尺寸遍历每个单只板的长宽得到最优解. 二.条件约束 基本约束条件(参考上图变量) 三.排样图形相同类型规律 由于计算量大,为了有效 ...

  10. Java多线程技术-Volatile关键字解析

    分析volatile关键字可以从这三个方面分析,什么是程序的原子性,什么是程序的可见性,什么是程序的有序性 什么是程序的原子性 以下语句那些是原子操作? public class ThreadCoun ...