什么是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. Network Wars-ZOJ2676最小割+01规划

    Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge Network of Byteland consists of n servers ...

  2. WIX

    1. Create msi File http://www.cnblogs.com/lienhua34/archive/2012/10/07/2714367.html 2. information a ...

  3. Redis缓存连接池管理

    import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.Assert;import ...

  4. easyUI 操作

    <a href="javascript:void(0)" onclick="locationUrl()">点击 自动加链接</a> fu ...

  5. \r与\n的区别

    \r : return 到当前行的最左边. \n: newline 向下移动一行,并不移动左右. Linux中\n表示回车+换行: Windows中\r\n表示回车+换行. Mac中\r表示回车+换行 ...

  6. 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  7. Nexpose下载安装注册一条龙

    附上两个下载链接: Windows版本(64bit) : http://download2.rapid7.com/download/NeXpose-v4/NeXposeSetup-Windows64. ...

  8. LeetCode——Letter Combinations of a Phone Number

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  9. 【转载】推荐5款超实用的.NET性能分析工具

    来源:http://www.csdn.net/article/2012-11-23/2812174-5-Good-and-useful-.NET-Profilers 虽然.NET框架号称永远不会发生内 ...

  10. Android微信智能心跳方案 (转)

    原创 2015-08-17 phoenix WeMobileDev 前言:在13年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和W ...