zoukankan      html  css  js  c++  java
  • 基于事件的异步模式(EAP)

    什么是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
  • 相关阅读:
    利用Linux系统生成随机密码的8种方法
    go语言中ASCII&unicode&utf8由来
    go语言指针
    js设计模式=封装
    python中urllib.request对象案例
    php实现jwt
    python错误捕获练习
    python多线程
    python多进程练习
    http三次握手,四次挥手
  • 原文地址:https://www.cnblogs.com/mcgrady/p/5660524.html
Copyright © 2011-2022 走看看