15.6.1 【Task使用】基于任务的异步模式
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使用】基于任务的异步模式的更多相关文章
- 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). 其次是 ...
- 基于事件的异步模式(EAP)
什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...
- Event-based Asynchronous Pattern Overview基于事件的异步模式概览
https://msdn.microsoft.com/zh-cn/library/wewwczdw(v=vs.110).aspx Applications that perform many task ...
- C#基于任务的异步模式
using System; using System.Threading; using System.Threading.Tasks; using static System.Console; //异 ...
- C# 基于任务的异步模式的创建与使用的简单示例
对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法. 1.创建一个拥有异步方法的类 该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带A ...
- .NET 基于任务的异步模式(Task-based Asynchronous Pattern,TAP) async await
本文内容 概述 编写异步方法 异步程序中的控制流 API 异步方法 线程 异步和等待 返回类型和参数 参考资料 下载 Demo 下载 Demo TPL 与 APM 和 EAP 结合(APM 和 EAP ...
- 【温故知新】C#基于事件的异步模式(EAP)
在开发winform和调用asp.net的web service引用的时候,会出现许多命名为 MethodNameAsync 的方法. 例如: winform的按钮点击 this.button1.Cl ...
- 三、基于任务的异步模式(TAP),推荐使用
一.引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用AP ...
- C#异步编程之基于任务的异步模式
http://www.cnblogs.com/afei-24/p/6757361.html该文讲了基于任务的编程,这里再详细介绍一下.一.延续任务 private async static void ...
- 基于事件的异步模式——BackgroundWorker
实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...
随机推荐
- ZooKeeper动态增加Server(动态增加节点)的研究(待实践)
说明:是动态增加Server,不是动态增加连接到ZK Server的Client. 场景如下(转自外文): 1.在t=t_1->[peer-1(Leader),peer-2],peer-1是主节 ...
- LucaCanali --DTRACE AND SYSTEMTAP 脚本工具
https://github.com/LucaCanali http://cern.ch/canali/
- Apache模块开发指南-APR池
转:原文: http://blog.csdn.net/zmxiangde_88/article/details/8038150 ------------------------------------ ...
- 在shell脚本中使用函数的返回值
#!/bin/bash - function mytest() { echo "arg1 = $1" if [ $1 = "1" ] ;then return ...
- 让devstack中的vm訪问外网
devstack默认会建立一个Public网络,地址为172.24.4.0/24,可是这个网络并非运营商分配给我们的网络.所以仅仅能通过nat的方式让devstack建立的虚拟机訪问外网. br-ex ...
- IO 字节流学习
复制图片和MP3 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Fil ...
- Android开发趣事记之周期性广告
前些天做了一个应用,由于怕影响用户体验,所以我将广告设定了一下,就是每启动软件8次.就会弹出一次广告. 在上传到应用宝后.竟然得到了这种结果: 看到了吧.无病毒,无广告. 看来审核人员是不会把应用连续 ...
- HDU 5532 / 2015ACM/ICPC亚洲区长春站 F.Almost Sorted Array
Almost Sorted Array Problem Description We are all familiar with sorting algorithms: quick sort, mer ...
- 关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案
关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案 目录 关于api-ms-win-crt-runtimel1-1-0dll缺失的解决方案 目录 安装VC redite ...
- 感知器算法 C++
We can estimate the weight values for our training data using stochastic gradient descent. Stochasti ...