您的位置:首页 > 其它

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

2016-07-11 15:53 435 查看

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


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: