基于事件的异步模式(EAP)

什么是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         }
View Code

转载于:https://www.cnblogs.com/mcgrady/p/5660524.html