利用TaskCompletionSource将EAP转换成TAP
1.原始的异步方法的调用
我们来看个简单的例子,在这里演示调用 WebClient.DownloadStringAsync 方法(这个方法不是 TAP),然后由 WebClient.DownloadStringCompleted 事件通知 UI 更新,这是大多数人都会用的方法。
- private
void DownloadString(string address) - {
- WebClient wc = new WebClient();
- wc.DownloadStringCompleted += (sender, e) =>
- {
- if (e.Cancelled)
- this.textBox1.Text = "Cancel";
- else
if (e.Error != null) - this.textBox1.Text = "Error";
- else
- this.textBox1.Text = e.Result;
- };
- wc.DownloadStringAsync(new Uri(address));
- }
客户端调用
- private
void button_DownloadString_Click(object sender, EventArgs e) - {
- DownloadString("https://www.google.com.tw/");
- }
这是一个很简单的例子,一旦若项目里有成千上万的通知事件跟 UI 绑在一起,维护起来会相当的痛苦。
2.将 EAP 转换成 TAP步骤
- 命名规则以 Async 为后缀
- 返回 Task 或是 Task<TResult>
- 调用 TaskCompletionSource 方法
改变 Task 状态可调用以下三个方法:SetCanceled、SetException、SetResult
- private Task<string> DownloadStringAsync(string address)
- {
- var tcs = new TaskCompletionSource<string>();
- WebClient wc = new WebClient();
- wc.DownloadStringCompleted += (sender, e) =>
- {
- if (e.Cancelled)
- tcs.SetCanceled();
- else
if (e.Error != null) - tcs.SetException(e.Error);
- else
- tcs.SetResult(e.Result);
- };
- wc.DownloadStringAsync(new Uri(address));
- return tcs.Task;
- }
客户端调用
- private async void button_DownloadStringAsync_Click(object sender, EventArgs e)
- {
- var task = DownloadStringAsync("https://www.google.com.tw/");
- await task;
- if (task.IsCanceled)
- {
- this.textBox1.Text = "Cancel";
- }
- else
if (task.IsFaulted) - {
- this.textBox1.Text = "Error";
- }
- else
if (task.IsCompleted) - {
- this.textBox1.Text = task.Result;
- }
- }
转自:http://www.it165.net/pro/html/201308/6710.html
3.微软的封装
- public
static
Task<byte[]> DownloadDataTask(this WebClient webClient, Uri address) - {
- // Create the task to be returned
- var tcs = new TaskCompletionSource<byte[]>(address);
- // Setup the callback event handler
- DownloadDataCompletedEventHandler handler = null;
- handler = (sender, e) => EAPCommon.HandleCompletion(tcs, e, () => e.Result, () => webClient.DownloadDataCompleted -= handler);
- webClient.DownloadDataCompleted += handler;
- // Start the async work
- try
- {
- webClient.DownloadDataAsync(address, tcs);
- }
- catch(Exception exc)
- {
- // If something goes wrong kicking off the async work,
- // unregister the callback and cancel the created task
- webClient.DownloadDataCompleted -= handler;
- tcs.TrySetException(exc);
- }
- // Return the task that represents the async operation
- return tcs.Task;
- }
- internal
class EAPCommon - {
- internal
static
void HandleCompletion<T>( - TaskCompletionSource<T> tcs, AsyncCompletedEventArgs e, Func<T> getResult, Action unregisterHandler)
- {
- // Transfers the results from the AsyncCompletedEventArgs and getResult() to the
- // TaskCompletionSource, but only AsyncCompletedEventArg's UserState matches the TCS
- // (this check is important if the same WebClient is used for multiple, asynchronous
- // operations concurrently). Also unregisters the handler to avoid a leak.
- if (e.UserState == tcs)
- {
- if (e.Cancelled) tcs.TrySetCanceled();
- else
if (e.Error != null) tcs.TrySetException(e.Error); - else tcs.TrySetResult(getResult());
- unregisterHandler();
- }
- }
- }
利用TaskCompletionSource将EAP转换成TAP的更多相关文章
- ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)
原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是 ...
- 利用jpedal进行pdf转换成jpeg,jpg,png,tiff,tif等格式的图片
项目中运用到pdf文件转换成image图片,开始时使用pdfbox开源库进行图片转换,但是转换出来的文件中含有部分乱码的情况.下面是pdfBox 的pdf转换图片的代码示例. try{ String ...
- 利用pdf2swf将PDF转换成SWF
将PDF转换成SWF可以使用SWFTools工具中的pdf2swf(http://www.swftools.org/),CSDN快速免积分下载地址http://download.csdn.net/de ...
- 利用NPOI将EXCEL转换成HTML的C#实现
领导说想做一个网页打印功能,而且模板可以自定义,我考虑了三个方案,一是打印插件,二是在线 html 编辑器,三是 excel 模板,领导建议用的是打印插件的形式,我研究了一下,一个是需要下载安装,二个 ...
- 转:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)
对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而 ...
- 【Spring Boot】Spring Boot之利用Logstash将日志转换成以JSON的格式存储和输出
一.Logstash的作用 Logstash是一个完全开源的工具,它可以对日志进行收集.过滤,能非常方便地将日志转换成以JSON的格式存储和输出,并将其存储供以后使用. 二.整合Logstash的步骤 ...
- 利用PHP将图片转换成base64编码的实现方法
先来说一下为什么我们要对图片base64编码 base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一.base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于网络传输. ...
- 利用反射将Datatable、SqlDataReader转换成List模型
1. DataTable转IList public class DataTableToList<T>whereT :new() { ///<summary> ///利用反射将D ...
- Java 里把 InputStream 转换成 String 的几种方法
我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量. 未真正关注这个问题之 ...
随机推荐
- java动态生成excel打包下载
@SuppressWarnings("unchecked") public String batchExport() throws DBException{ @SuppressWa ...
- NYOJ题目768移位密码
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtIAAAJqCAIAAACJkTDlAAAgAElEQVR4nO3du3Ljvpa34b4J574Qx7
- JavaScript基础——使用数组
Array对象提供存储和处理一组其他对象的一种手段.数组可以存储数值.字符串或其他JavaScript对象.创建JavaScript数组有几种不同的方法.例如,下面的语句穿件同样的驻足的3个相同的版本 ...
- .net学习笔记---lambda表达式(自执行方法)
http://www.cnblogs.com/jesse2013/p/happylambda.html#b034 lambda表达式 http://www.cnblogs.com/OceanEyes/ ...
- 数据结构和算法 – 8.链表
8.1.数组存在的问题 在处理列表的时候数组是常用的数据结构.数组可以对所存储的数据项提供快速地存取访问,而且它很易于进行循环遍历操作.当然,数组已经是语言的一部分了,用户不需要使用额外的内存,也不需 ...
- EF – 6.一对一关联
5.6.6 <一对一关联概述> 5.6.7 <一对一关联CRUD演示> 在两讲视频中,首先介绍了数据库中一对一关联表的设计规范,接着通过实例介绍了如何合适Entity Fr ...
- WMI测试
https://social.msdn.microsoft.com/Forums/windowshardware/zh-CN/c5af7959-95d3-4e1b-ab40-96a2a31c2af2/ ...
- 超好用的plsql设置
http://blog.itpub.net/24496241/viewspace-740917/
- Delphi运算符总结
分类 运算符 操作 操作数 结果类型 范例 算术运算符(加法.减法和乘法运算符的结果为参加运算的两个数据中的精度高的类型) + 加 整数,实数 整数,实数 X + Y - 减 整数,实数 整数,实数 ...
- POJ3685 Matrix(嵌套二分)
同行元素递减,同列元素递增,采用嵌套二分的方法 #include<cstdio> #include<iostream> #include<cstdlib> #inc ...