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. gcc动态链接库so的制作和使用

    http://blog.csdn.net/CSqingchen/article/details/51546784 参考: http://blog.sina.com.cn/s/blog_69e96b37 ...

  2. Swift开发教程--怎样清除模拟器的数据

    打开xcode->preference->location->derived Data,进入文件夹下,删除里面所以后的文件夹就能够了.

  3. ListView无障碍识别整个listView,不识别item,设置了setContentDescription也没实用

    点击ListView的时候.无障碍识别到的是整个listView,不会读点击的那个item. 解决的方法是在getView里手动设置: <span style="font-size:1 ...

  4. 一个jeecg整合activiti的学习样例,源代码下载

    社区成员:刘京华採用技术:jeecg+ activiti源代码下载地址:http://pan.baidu.com/s/1dDxOHrV 截图演示:  2.jpg (71.81 KB, 下载次数: 0) ...

  5. C++ Development Library

    C/C++ 开发库 | C/C++ Development Library 这里收集一些著名的 C/C++ 开发库.SDK.类库.可复用类与结构代码 等信息,列举它们的介绍.参考和网站链接,为各位 C ...

  6. DirectFB编程【转】

    本文转载自:http://www.cnblogs.com/274914765qq/p/4358088.html DirectFB编程 一.简介 DirectFB是一个轻量级的提供硬件图形加速,输入设备 ...

  7. 0.0.0.0 IPAddress.Any 【】127.0.0.1 IPAddress.Loopback 【】localhost

    0.0.0.0  IPAddress.Any https://msdn.microsoft.com/en-us/library/system.net.ipaddress.any(v=vs.110).a ...

  8. C# WINFORM 局域网PING 工具(技术改变世界-cnblog)

    WINFORM 局域网PING 工具(技术改变世界-cnblog) 需求: 1.实时更新 日期时间 2.可以ping多个IP 地址,必须判断 IP地址的正确性,不能为广播地址 3.对ping结果的显示 ...

  9. SiteMesh3使用实例和详解

    一.SiteMesh介绍 SiteMesh是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的.[来自百度百科] 通俗的理解就是,SiteMesh把页面中变化的和 ...

  10. 浅谈JavaScript中的cookie

    什么是cookie?简单来说,cookie就是网站服务器存放在我们计算机上的一小段(一般大小不超过4KB)用来识别和记录用户的个人信息的文本.HTTP协议是一种没有“状态”的传输协议,也就是说,服务器 ...