.NET三种异步模式(APM、EAP、TAP)

APM模式:

.net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法。

.net中有很多类实现了该模式(比如HttpWebRequest),同时我们也可以自定义类来实现APM模式(继承IAsyncResult接口并且实现BeginXXX和EndXXX方法)

 1 /// <summary>
 2         /// 异步
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void button2_Click(object sender, EventArgs e)
 7         {
 8             //先清空上一次查询结果
 9             this.richTextBox1.Text = "";
10
11             var url = this.textBox1.Text.Trim();
12             var request = HttpWebRequest.Create(url);
13             request.BeginGetResponse(AsyncCallbackImpl, request);//BeginGetResponse,发起异步请求
14         }
15
16         /// <summary>
17         /// 回调
18         /// </summary>
19         /// <param name="ar"></param>
20         public void AsyncCallbackImpl(IAsyncResult ar)
21         {
22             HttpWebRequest request = ar.AsyncState as HttpWebRequest;
23             var response = request.EndGetResponse(ar);//EndGetResponse,异步请求完成
24             var stream = response.GetResponseStream();
25             StringBuilder sb = new StringBuilder();
26             sb.AppendLine("当前线程Id:" + Thread.CurrentThread.ManagedThreadId);
27             using (StreamReader reader = new StreamReader(stream))
28             {
29                 var content = reader.ReadLine();
30                 sb.AppendLine(content);
31                 this.richTextBox1.Text = sb.ToString();
32             }
33         }
34   
1 Func<int, int> func = (i) => i + 1;
2             func.BeginInvoke(5, (asyncResult) => {
3                 //Console.WriteLine("call back,param:"+result.AsyncState);
4                 int result = func.EndInvoke(asyncResult);
5                 Console.WriteLine("result:"+ result);
6             }, null);

EAP模式:

基于事件的异步模式是.net 2.0提出的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消、进度报告和报告结果。然而.net中并不是所有的类都支持EAP。

当调用基于事件的EAP模式的类的XXXAsync方法时,就开始了一个异步操作,并且基于事件的EAP模式是基于APM模式之上的,而APM又是建立在委托之上的。下面的Demo就以BackgroundWorker类来演示如何使用EAP异步。

 1 BackgroundWorker worker = new BackgroundWorker();
 2             worker.DoWork += Worker_DoWork;
 3             worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
 4             worker.RunWorkerAsync(null);
 5
 6         private static void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 7         {
 8             Console.WriteLine("dowork completed");
 9         }
10
11         private static void Worker_DoWork(object sender, DoWorkEventArgs e)
12         {
13             Console.WriteLine("dowork");
14         }

TAP模式:

.net 4.0为我们带来了Task的异步,我们有以下三种方法创建Task。

1,Task.Factory.StartNew,比较常用。

2,Task t1 = new Task(() => { Console.WriteLine("t1 start"); });    t1.Start();

3,Task.Run,是.net 4.5中增加的。

4,Task.FromResult,如果结果是已计算,就可以使用这种方法来创建任务。

 1 /// <summary>
 2         /// 使用async/await
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private async void button5_Click(object sender, EventArgs e)
 7         {
 8             this.richTextBox1.Text = "正在处理请求...";
 9
10             await DoWorkAsync();
11         }
12
13         public async Task DoWorkAsync()
14         {
15             var url = this.textBox1.Text.Trim();
16             var request = HttpWebRequest.Create(url);
17             var response = request.GetResponse();
18             var stream = response.GetResponseStream();
19             using (StreamReader reader = new StreamReader(stream))
20             {
21                 var content = reader.ReadToEnd();
22                 this.richTextBox1.Text = content;
23             }
24         }
25
26   

原文地址:https://www.cnblogs.com/fanfan-90/p/12006157.html

时间: 2024-08-01 12:41:53

.NET三种异步模式(APM、EAP、TAP)的相关文章

.Net中的几种异步模式

.Net中的几种异步模式 .Net中的几种异步模式基于事件的异步模式(EAP)IAsyncResult接口简单的异步模式--引入lambdaTask手动异步编程的问题 在C# 5.0引入async之前,存在几种异步编程模式,比如Event-based Asynchronous Pattern.IAsyncResult接口.Task等等. 基于事件的异步模式(EAP) private void DumpWebPage(Uri uri) { WebClient webClient = new Web

后勤模块数据源的增量队列(Delta-Queue)三种更新模式(Update Mode)

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4296684.html 数据的更新(同步)有三种方式:V1.V2.V3: V1 - Synchronous update,同步更新,数据会立即更新到目的地(如应用数据表Application Tables.增强队列Delta-Queue),数

Boss要求零数据丢失,Data Guard的三种保护模式如何选择?

公司现在越来越重视数据的灾备,部署了大量的Data Guard和Oracle GoldenGate.核心系统的数据非常重要,大boss的要求很简单就是数据零丢失. 仔细衡量Data Guard的三种保护模式,在最大可用和最大保护之间展开了激烈的讨论.下面从技术层面看看这两种保护模式的特点和区别. 零数据丢失: 在DataGuard中同步传输SYNC(synchronous transport)又称为零数据丢失.因为要等到确认事务恢复所需要的redo数据已经被写入备用数据库的磁盘上(Standby

Apache三种工作模式介绍与配置

Apache三种工作模式介绍与配置 一.Apache的三种工作模式介绍及相关查看方法 1.Apache三种工作模式简介 Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式.它们分别是prefork,worker和event,它们同时也代表这Apache的演变和发展. Apache在configure配置编译参数的时候,可以使用 --with-mpm=prefork|worker|event 来指定编译为那一种MPM,当然也可以用编译为三种

【DG】Data Guard 的三种保护模式

Data Guard 的三种保护模式 官方文档链接 http://docs.oracle.com/cd/E11882_01/server.112/e41134/protection.htm#SBYDB02000 最大可用模式(Maximum Availability) 这种保护模式在不影响主库可用性的前提下提供最高水平的数据保护 在主库需要完成两件事,事务才会被提交 恢复事务所需要的 redo 数据写入在线日志文件(online redo log) 恢复事务所需要的 redo 数据写入同步备库(

Vmware虚拟机三种网络模式用途

为了更深层次的对Vmware虚拟机三种网络模式的理解,http://www.3lian.com/edu/2012/03-29/24049.htm 在网上查一些资料,通过对资料的理解,将此总结如下. 1.Bridged模式 在这种模式下,虚拟网卡和物理网卡同在一个IP网段,能够互相通信,并且能够浏览外网(前提是物理网卡能够浏览外网).它用的是Vmnet 0网络,在这里Vmnet 0网络充当了虚拟交换机的用途. 2.Host Only模式 在这种模式下,虚拟网卡只能和物理网卡进行通信,不能够浏览外网

VMware虚拟机三种工作模式

工作模式 VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,就应该先了解一下这三种工作模式. bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下,你需要手工为虚拟系统配置IP地址.子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信.同时,由于这个虚拟系统是局域网中的一

vsftpd服务程序的三种认证模式

vsftpd服务程序的三种认证模式的配置方法--匿名开放模式.本地用户模式以及虚拟用户模式.了解PAM可插拔认证模块的原理.作用以及实战配置方法,通过实战课程进一步继续学习SELinux服务的配置方法,扩展学习TFTP简单文件传输协议理论及实操课程 文件传输协议 一般来讲,人们将电脑联网的首要需求就是获取资料,而文件传输是其中非常重要的方式之一,21世纪的互联网是由几千万台个人电脑.工作站.小型机.大型机等等不同型号.架构的物理设备共同组成的,即便是个人电脑上也可能会装有诸如Linux.Wind

vmware虚拟机三种网络模式详解_转

原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 由于Linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费.那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有vmware workstations和virtual box等.在使用虚拟机软件的时候,很多初学者都会遇到很多问题,而vmware的网络连接问题是大家