随笔 - 410  文章 - 0  评论 - 519  阅读 - 148万 

什么是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         }
View Code
复制代码

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         }
View Code
复制代码

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

posted on   永远的麦子  阅读(2509)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示