異步編程模型(APM)模式

什麼是APM

.net 1.0時期就提出的一種異步模式,而且基於IAsyncResult接口實現BeginXXX和EndXXX相似的方法。異步

.net中有不少類實現了該模式(好比HttpWebRequest),同時咱們也能夠自定義類來實現APM模式(繼承IAsyncResult接口而且實現BeginXXX和EndXXX方法),下面的Demo就以HttpWebRequest類來實現APM模式的異步。ide

Demo

下面分別使用同步和異步APM模式來實現,讀取一個網頁內容,而且將內容展現到界面上。ui

1,同步this

就是日常咱們寫代碼的方式,代碼以下。url

  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)spa

主要是經過BeginGetResponse和EndGetResponse來調用的。.net

  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

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

相關文章
相關標籤/搜索