什么是EAP异步编程模式
EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消、进度报告和报告结果。然而.net中并不是所有的类都支持EAP,总结起来有以下17个类支持EAP异步。
System.Object的派生类型:
System.Activies.WorkflowInvoke
System.Deployment.Application.ApplicationDeployment
System.Deployment.Application.InPlaceHosingManager
System.Net.Mail.SmtpClient
System.Net.PeerToPeer.PeerNameResolver
System.Net.PeerToPeer.Collaboration.ContactManager
System.Net.PeerToPeer.Collaboration.Peer
System.Net.PeerToPeer.Collaboration.PeerContact
System.Net.PeerToPeer.Collaboration.PeerNearMe
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 }