.net 1.0時期就提出的一種異步模式,而且基於IAsyncResult接口實現BeginXXX和EndXXX相似的方法。異步
.net中有不少類實現了該模式(好比HttpWebRequest),同時咱們也能夠自定義類來實現APM模式(繼承IAsyncResult接口而且實現BeginXXX和EndXXX方法),下面的Demo就以HttpWebRequest類來實現APM模式的異步。ide
下面分別使用同步和異步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 }
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 }
同步的方式,代碼是順序執行的,而且發送請求的時候界面會阻塞。可是異步模式界面不會阻塞,主線程會當即返回,等到異步請求完成的時候再從線程池中取一個線程處理。線程