.NET三种异步模式(APM、EAP、TAP)
APM模式:
.net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法。
.net中有很多类实现了该模式(比如HttpWebRequest),同时我们也可以自定义类来实现APM模式(继承IAsyncResult接口并且实现BeginXXX和EndXXX方法)
/// <summary>
/// 异步
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
//先清空上一次查询结果
this.richTextBox1.Text = ""; var url = this.textBox1.Text.Trim();
var request = HttpWebRequest.Create(url);
request.BeginGetResponse(AsyncCallbackImpl, request);//BeginGetResponse,发起异步请求
} /// <summary>
/// 回调
/// </summary>
/// <param name="ar"></param>
public void AsyncCallbackImpl(IAsyncResult ar)
{
HttpWebRequest request = ar.AsyncState as HttpWebRequest;
var response = request.EndGetResponse(ar);//EndGetResponse,异步请求完成
var stream = response.GetResponseStream();
StringBuilder sb = new StringBuilder();
sb.AppendLine("当前线程Id:" + Thread.CurrentThread.ManagedThreadId);
using (StreamReader reader = new StreamReader(stream))
{
var content = reader.ReadLine();
sb.AppendLine(content);
this.richTextBox1.Text = sb.ToString();
}
}
Func<int, int> func = (i) => i + ;
func.BeginInvoke(, (asyncResult) => {
//Console.WriteLine("call back,param:"+result.AsyncState);
int result = func.EndInvoke(asyncResult);
Console.WriteLine("result:"+ result);
}, null);
EAP模式:
基于事件的异步模式是.net 2.0提出的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消、进度报告和报告结果。然而.net中并不是所有的类都支持EAP。
当调用基于事件的EAP模式的类的XXXAsync方法时,就开始了一个异步操作,并且基于事件的EAP模式是基于APM模式之上的,而APM又是建立在委托之上的。下面的Demo就以BackgroundWorker类来演示如何使用EAP异步。
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += Worker_DoWork;
worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
worker.RunWorkerAsync(null); private static void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("dowork completed");
} private static void Worker_DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine("dowork");
}
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(),如果结果是已计算,就可以使用这种方法来创建任务。
/// <summary>
/// 使用async/await
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void button5_Click(object sender, EventArgs e)
{
this.richTextBox1.Text = "正在处理请求..."; await DoWorkAsync();
} public async Task DoWorkAsync()
{
var url = this.textBox1.Text.Trim();
var request = HttpWebRequest.Create(url);
var response = request.GetResponse();
var stream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(stream))
{
var content = reader.ReadToEnd();
this.richTextBox1.Text = content;
}
}
.NET三种异步模式(APM、EAP、TAP)的更多相关文章
- 后勤模块数据源的增量队列(Delta-Queue)三种更新模式(Update Mode)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 聊聊Dataguard的三种保护模式实验(上)
Data Guard是Oracle高可用性HA的重要解决方案.针对不同的系统保护需求,DG提供了三种不同类型的保护模式(Protection Mode),分别为:最大保护(Maximum Protec ...
- localforage 对不同浏览器 使用不同的缓存策略 , 大大提高了性能 ,IndexedDB,WebSQL 和 localStorage 三种存储模式
支持回调的异步 API: 支持 IndexedDB,WebSQL 和 localStorage 三种存储模式(自动为你加载最佳的驱动程序): 支持 BLOB 和任意类型的数据,让您可以存储图片,文件等 ...
- Apache的三种工作模式及相关配置
Apache的三种工作模式 作为老牌服务器,Apache仍在不断地发展,就目前来说,它一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块).它们分别是 prefor ...
- Http中的三种请求处理模式(MPM)的区别
MPM---包括基于事件/异步,线程化和预分叉 MPM(multi-processing module)多种请求处理模式,分为三种工作模式: prefork worker event prefork- ...
- IOS开发之自定义Button(集成三种回调模式)
前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...
- 云计算的三种服务模式:SaaS/PaaS/IaaS
转载http://blog.chinaunix.net/uid-22414998-id-3141499.html 定义 云计算主要分为三种服务模式,而且这个三层的分法重要是从用户体验的角度出发的: S ...
- DGbroker三种保护模式的切换
1.三种保护模式 – Maximum protection 在Maximum protection下, 可以保证从库和主库数据完全一样,做到zero data loss.事务同时在主从两边提交完成,才 ...
- 虚拟机安装Ubuntu三种网络模式
VMWare提供三种工作模式桥接(bridge).NAT(网络地址转换)和host-only(主机模式). NAT(网络地址转换) 在NAT模式下,虚拟系统需要借助NAT(网络地址转换)功能,通过宿主 ...
随机推荐
- 《计算机网络第7版》PDF+《计算机网络释疑与习题解答第7版》PDF
谢希仁 链接:https://pan.baidu.com/s/1_sM9bFL0y3S1NXBz5rLyvg 提取码:po3i 计算机网络(第7版)谢希仁 · 语雀 https://www.yuque ...
- ThreadLocal 简单解析
ThreadLocal 简单解析 基于jdk1.8 ThreadLocal一定不陌生,开发中常用,也是面试里的常客了,但是往往我们可能只是知道该类的作用.学习该类对于个人的多线程编码能力是大有裨益的, ...
- Office365激活方法(无需密钥)
@echo off title Activate Office 365 ProPlus for FREE - MSGuides.com&cls&echo =============== ...
- 用 PHP 函数变量数组改变代码结构
项目越做越大,代码越来越乱,维护困难.原因很多吧.起初为了实现功能,并没有注重代码的结构,外包公司嘛.虽然公司的项目负责人一直考虑复用.封装,但是我觉得基本上没有达到想要的效果.因为整个代码中没有用到 ...
- C++:Special Member Functions
Special Member Functions 区别于定义类的行为的普通成员函数,类内有一类特殊的成员函数,它们负责类的构造.拷贝.移动.销毁. 构造函数 构造函数控制对象的初始化过程,具体来说,就 ...
- $.Ajax、$.Get、$.Post代码实例参数解析
$.ajax 语法: $.ajax({name:value, name:value, ... }) 示例: $.ajax({ url: "/testJson", type: &qu ...
- Kubernetes 部署Web UI (Dashboard)
Kubernetes 部署Web UI (Dashboard) 项目下载地址:https://github.com/kubernetes/kubernetes/tree/master/cluster/ ...
- 异步IO/协程/数据库/队列/缓存(转)
原文:Python之路,Day9 - 异步IO\数据库\队列\缓存 作者:金角大王Alex add by zhj: 文章很长 引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这 ...
- 基于Task定时检测网络本地网络状况
首先我们需要使用winInet.dll中的InternetGetConnectedState方法来检测本地是否连接网络,然后再通过ping的方式来获取网络状况. 然后我们采用Task来开辟一个线程来定 ...
- 高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)
高性能TcpServer(C#) - 1.网络通信协议 高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP) 高性能TcpS ...