什么是APM

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

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

Demo

下面分别使用同步和异步APM模式来实现,读取一个网页内容,并且将内容展示到界面上。

1,同步

就是平常我们写代码的方式,代码如下。

  1 /// <summary>
2 /// 同步
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void button1_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 var response = request.GetResponse();
14 var stream = response.GetResponseStream();
15 using (StreamReader reader= new StreamReader(stream))
16 {
17 var content = reader.ReadToEnd();
18 this.richTextBox1.Text = content;
19 }
20 }

2,异步(APM)

主要是通过BeginGetResponse和EndGetResponse来调用的。

  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 }

同步的方式,代码是顺序执行的,并且发送请求的时候界面会阻塞。但是异步模式界面不会阻塞,主线程会立即返回,等到异步请求完成的时候再从线程池中取一个线程处理。

异步编程模型(APM)模式的更多相关文章

  1. 转:[你必须知道的异步编程]——异步编程模型(APM)

    本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0——C#4.0中一些 ...

  2. [你必须知道的异步编程]——异步编程模型(APM)

    本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中 介绍了从C#1.0——C#4.0中一 ...

  3. 一、异步编程模型(APM)

    一.概念 APM即异步编程模式的简写(Asynchronous Programming Model).大家在写代码的时候或者查看.NET 的类库的时候肯定会经常看到和使用以BeginXXX和EndXX ...

  4. C# 异步编程1 APM模式异步程序开发

    C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...

  5. 异步编程:IAsyncResult异步编程模型 (APM)

    http://www.cnblogs.com/heyuquan/archive/2013/03/22/2976420.html

  6. .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)

    本文内容 异步编程类型 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Prog ...

  7. C#异步编程の-------异步编程模型(APM)

    术语解释: APM               异步编程模型, Asynchronous Programming Model EAP                基于事件的异步编程模式, Event ...

  8. 【温故知新】c#异步编程模型(APM)--使用委托进行异步编程

    当我们用到C#类许多耗时的函数XXX时,总会存在同名的类似BeginXXX,EndXXX这样的函数. 例如Stream抽象类的Read函数就有 public abstract int Read(byt ...

  9. c# 基于委托的异步编程模型(APM)测试用例

    很多时候,我们需要程序在执行某个操作完成时,我们能够知道,以便进行下一步操作. 但是在使用原生线程或者线程池进行异步编程,没有一个内建的机制让你知道操作什么时候完成,为了克服这些限制,基于委托的异步编 ...

随机推荐

  1. 基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)

            编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的.       基于现有资料 ...

  2. Linux下安装GO语言环境

    在/root/downloads/下 wget -c https://storage.googleapis.com/golang/go1.7.1.linux-amd64.tar.gz 解压文件至/us ...

  3. mac os中配置多个jdk(转载+)

    1.首先安装所有的JDk: * Mac自带了的JDK6,安装在目录:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/下. * JDK7,JDK8则 ...

  4. itput

    这个网站也非常好,有很多金融it知识免费下载,下载验证码t7QA,名字新共产主义

  5. jquery.validate使用 - 自定义错误信息

    自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...

  6. 未解决的问题,登录163邮箱http://mail.163.com/,用xpath的方式定位密码输入框的时候,总是报找不到该元素

    退出的时候出现: xpath定位方法: 注意xpath路径写的太长,如果层级全部写完定位不到,就尝试去掉一些层级

  7. hightcharts 3d 堆积图下钻

    图片效果 ***************代码部分****************************************************** <!doctype html> ...

  8. 通过nginx代理之后,获取客户端ip

    1.相关nginx配置(通过header将客户端ip,host等信息传入) location ~ .*.do$ { proxy_set_header X-Real-IP $remote_addr; p ...

  9. windos系统定时执行批处理文件(bat文件)

    Win7怎么设置定时自动执行任务? 点击开始按钮,依次选择打开“所有程序—附件—系统工具”,找到“任务计划程序”即可打开Win7系统的任务计划设置面板.也可以点击Win7开始按钮,在多功能搜索框中输入 ...

  10. Evolutionary Computing: 5. Evolutionary Strategies(2)

    Resource: Introduction to Evolutionary Computing, A.E.Eliben Outline recombination parent selection ...