异步编程模型(APM)模式
什么是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)模式的更多相关文章
- 转:[你必须知道的异步编程]——异步编程模型(APM)
本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0——C#4.0中一些 ...
- [你必须知道的异步编程]——异步编程模型(APM)
本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中 介绍了从C#1.0——C#4.0中一 ...
- 一、异步编程模型(APM)
一.概念 APM即异步编程模式的简写(Asynchronous Programming Model).大家在写代码的时候或者查看.NET 的类库的时候肯定会经常看到和使用以BeginXXX和EndXX ...
- C# 异步编程1 APM模式异步程序开发
C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...
- 异步编程:IAsyncResult异步编程模型 (APM)
http://www.cnblogs.com/heyuquan/archive/2013/03/22/2976420.html
- .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)
本文内容 异步编程类型 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Prog ...
- C#异步编程の-------异步编程模型(APM)
术语解释: APM 异步编程模型, Asynchronous Programming Model EAP 基于事件的异步编程模式, Event ...
- 【温故知新】c#异步编程模型(APM)--使用委托进行异步编程
当我们用到C#类许多耗时的函数XXX时,总会存在同名的类似BeginXXX,EndXXX这样的函数. 例如Stream抽象类的Read函数就有 public abstract int Read(byt ...
- c# 基于委托的异步编程模型(APM)测试用例
很多时候,我们需要程序在执行某个操作完成时,我们能够知道,以便进行下一步操作. 但是在使用原生线程或者线程池进行异步编程,没有一个内建的机制让你知道操作什么时候完成,为了克服这些限制,基于委托的异步编 ...
随机推荐
- linux vmware安装完成后如何设置桥接上网
linux 主机初步安装完成后还是不能上网,如何设置共享上网 1 首先要明白上网方式:虚拟机网卡-------------------vmnet1--------------------真实机网卡( ...
- openGL 环境配置
1.(glfw) 参考地址:http://www.cnblogs.com/be2n2me/p/3701338.html 在Mac OS X EI Capitan上sudo make install时遇 ...
- python的tab自动补全
vi tab.py #!/usr/bin/env python # python startup file import sys import readline import rlcompleter ...
- Redis缓存连接池管理
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.Assert;import ...
- java源代码跟踪
首先我们要学会的是将JDK源码加载Eclipse中. 1.点“窗口”——>"首选项",选择左边的"Java"——>"已安装的JRE&quo ...
- MATLAB地图工具箱学习总结(一)从地图投影说起
MATLAB地图工具箱学习总结(一)从地图投影说起 前言 本学期地图投影课上,李连营老师建议我们使用MATLAB完成每周的作业.从大二上学期开始接触MATLAB学习数学运算和地理数据处理的我,自然不会 ...
- 话说C++中的左值、纯右值、将亡值
写在前面 C++中有“左值”.“右值”的概念,C++11以后,又有了“左值”.“纯右值”.“将亡值”的概念.关于这些概念,许多资料上都有介绍,本文在拾人牙慧的基础上又加入了一些自己的一些理解,同时提出 ...
- Javascript学习笔记:闭包题解(2)
代码: var name='The Window'; var object={ name:'My Object', getNameFunc:function(){ return function(){ ...
- virtualbox安装增强功能时【未能加载虚拟光盘】
virtualbox安装增强功能时[未能加载虚拟光盘] 今天在使用Virtualbox中的Ubuntu虚拟机,想安装增强功能来实现更改分辨率,但是在安装时出错:未能加载虚拟光驱 VBoxsGuestA ...
- .Net架构必备工具列表
★微软MSDN:每个开发人员现在应该下载的十种必备工具 点此进入 ★网友总结.Net架构必备工具列表 Visual Studio 这个似乎是不言而喻的,只是从严谨的角度,也列在这.实际上,现在也有一个 ...