異步編程模型(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         }
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

同步的方式,代碼是順序執行的,並且發送請求的時候界面會阻塞。但是異步模式界面不會阻塞,主線程會立即返回,等到異步請求完成的時候再從線程池中取一個線程處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM