什么是EAP异步编程模式
EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具备一个或者多个以Async为后缀的方法和对应的Completed事件,而且这些类都支持异步方法的取消、进度报告和报告结果。然而.net中并非全部的类都支持EAP,总结起来有如下17个类支持EAP异步。html
System.Object的派生类型:
System.Activies.WorkflowInvoke 编程
System.Deployment.Application.ApplicationDeployment异步
System.Deployment.Application.InPlaceHosingManageride
System.Net.Mail.SmtpClient异步编程
System.Net.PeerToPeer.PeerNameResolverpost
System.Net.PeerToPeer.Collaboration.ContactManagerthis
System.Net.PeerToPeer.Collaboration.Peerurl
System.Net.PeerToPeer.Collaboration.PeerContactspa
System.Net.PeerToPeer.Collaboration.PeerNearMe.net
System.ServiceModel.Activities.WorkflowControlClient
System.ServiceModel.Discovery.AnnoucementClient
System.ServiceModel.Discovery.DiscoveryClient
System.ComponentModel.Component的派生类型:
System.ComponentModel.BackgroundWorker
System.Media.SoundPlay
System.Net.WebClient
System.Net.NetworkInformation.Ping
System.Windows.Forms.PictureBox(继承于Control类,Control类派生于Component类)
当调用基于事件的EAP模式的类的XXXAsync方法时,就开始了一个异步操做,该方法调用完成后通知线程池的线程去执行耗时的操做,因此当UI线程调用该方法时,就不会阻塞UI线程了。
而且基于事件的EAP模式是基于APM模式之上的,而APM又是创建在委托之上的。下面的Demo就以BackgroundWorker类来演示如何使用EAP异步。
Demo
要实现的需求仍是上一节APM所展现的例子,点击请求按钮,UI线程当即返回(界面就不会阻塞了),而后发起异步请求远程url资源,当异步请求完成时,将内容展现到界面上,代码以下。
1 /// <summary> 2 /// 异步EAP 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void button3_Click(object sender, EventArgs e) 7 { 8 BackgroundWorker worker = new BackgroundWorker(); 9 worker.DoWork += new DoWorkEventHandler(DoWork);//注册DoWork事件来实现异步 10 worker.RunWorkerAsync(this); 11 } 12 13 /// <summary> 14 /// 异步操做 15 /// </summary> 16 /// <param name="sender"></param> 17 /// <param name="e"></param> 18 public void DoWork(object sender, DoWorkEventArgs e) 19 { 20 //先清空上一次查询结果 21 this.richTextBox1.Text = ""; 22 23 var url = this.textBox1.Text.Trim(); 24 var request = HttpWebRequest.Create(url); 25 var response = request.GetResponse(); 26 var stream = response.GetResponseStream(); 27 using (StreamReader reader = new StreamReader(stream)) 28 { 29 var content = reader.ReadToEnd(); 30 this.richTextBox1.Text = content; 31 } 32 }