异步编程模型(APM)模式
2016-07-11 15:06
351 查看
什么是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 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 }
View Code
同步的方式,代码是顺序执行的,并且发送请求的时候界面会阻塞。但是异步模式界面不会阻塞,主线程会立即返回,等到异步请求完成的时候再从线程池中取一个线程处理。
相关文章推荐
- 12 WEB DEVELOPMENT TRENDS FOR 2016
- DPM--对象检测开山之作
- 列出rpm包内容和解压rpm包内容
- vim-snipmate编写snippet的语法
- vim-snipmate的c.snippets(2016.7.10)
- 读书笔记-《人人都是产品经理V1.1》
- 深入分析PMS服务(一)
- 【笔记】PMBOK第4章项目整合管理
- 在CYGWIN下编译和运行软件Bundler ,以及PMVS,CMVS的编译与使用
- NPM 使用介绍
- Bundler,PMVS,CMVS的编译与使用
- 产品助理day5
- BumpMap、NormalMap的区别
- RPM一些常用的命令
- 使用RPM打包QT程序
- rpm包
- PMOS NMOS管原理
- RHEL 软件包管理 rpm yum 源码编译
- npm 一直报内存溢出
- PMP:项目范围管理学习笔记目录