.NET2.0版本中基于事件的异步编程模式(EAP)

. 简介:

基于事件的异步编程模式(EAP)是.NET Framework 2.0 中引入的一种编程模式,是一种异步编程的方式,与.NET中的APM(异步编程模型)和TPL(任务并行库)不同,入口点不是Beginxxx和Endxxx方法或Task的异步方法,而是定义了异步方法并触发事件来通知异步操作完成。异步执行单元采用回调函数注册的方式,通过在异步操作完成时触发事件来通知应用程序。EAP的实现是基于.NetDelegate类型,该类型定义了一系列委托和异步操作的钩子事件(异步事件单元中事件的供应商)。EAP中最重要的概念是两个AsynXXX方法,它们分别触发了异步操作的开始和结束(异步事件单元中事件的消费者)。在这个模式中,执行异步操作的类是一种称为XXxCompletedEventArgs 的类型,该类型在构造函数中封装了异步操作的结果。

. EAP的步骤:

  1. 为异步操作定义方法以及事件。该操作负责引发已定义的事件以通知应用程序异步操作的状态。

例如,下面示例中是使用WebClient.DownloadFileAsync()异步方式下载文件,为异步操作定义回调函数,并定义完成事件和回调函数:

public static void Main(){
    WebClient webClient = new WebClient();
    webClient.DownloadFileCompleted += 
             new AsyncCompletedEventHandler( DownloadFileCallback );
    Uri uri = new Uri("http://www.xxx.com/xx.jpg");
    webClient.DownloadFileAsync(uri, @".\xx.jpg");
}

private static void DownloadFileCallback(Object sender, AsyncCompletedEventArgs e){  
        Console.WriteLine("Download complete");
}

在示例中,WebClient.DownloadFileCompleted 事件表示异步操作的完成。然后使用AsyncCompletedEventHandler 事件处理程序类型向Completed事件添加DownloadFileCallback方法。在异步操作完成时,使用DownloadFileCallback实例作为回调函数。

  1. 启动异步任务。在下面的示例中,使用WebClient.DownloadFileAsync()方法启动异步任务:
Uri uri = new Uri("http://www.xxx.com/xx.jpg");
webClient.DownloadFileAsync(uri, @".\xx.jpg");

在异步任务完成后返回结果以及提供状态或其他信息时调用回调函数。

  1. 在回调函数中检索结果

在异步操作完成后,会异步触发回调函数,可以从回调函数获取异步操作的结果。例如,在DownloadFileCallback示例中:

```csharp
private static void DownloadFileCallback(Object sender, AsyncCompletedEventArgs e){
if (e.Cancelled == true)
{
Console.WriteLine("Download has been canceled. result is {0}",
e.Cancelled);
}
else{
Console.WriteLine("Download complete");
}
}


使用`AsyncCompletedEventArgs`,在回调函数中检索是否已取消异步操作,并可获取异步操作的结果。

#. EAP的优点:

- 写出的代码非常清晰,避免了APM的复杂性以及TPL的混乱性。
- 使用更加公用的事件委托为异步方法添加了重载方法,使得代码更具有可读性和可维护性。


#. 示例一:

下面是一个简单的控制台程序,下载CSDN博客文章,并使用EAP来提供异步响应:

```csharp
using System;
using System.Net;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string url = "https://blog.csdn.net/q1005206184/article/details/104502634";
        string filename = "csdn.html";

        DownloadFile(url, filename);
        Console.WriteLine("download started...");
        Console.ReadLine();
    }

    static void DownloadFile(string url, string filename)
    {
        WebClient client = new WebClient();
        client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
        client.DownloadFileAsync(new Uri(url), filename);
    }

    static void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        Console.WriteLine("download complete...");
    }

    static void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine("downloading... {0}% complete", e.ProgressPercentage);
    }
}

在上面的示例中,Create方法以异步方式下载指定的文件,并使用DownloadFileCompleted回调函数来通知该操作已经完成。另外,使用DownloadProgressChanged事件来在控制台窗口中显示下载进度。最后,在Main方法中调用DownloadFile方法。

. 示例二:

下面是另一个示例用于演示基于事件的异步编程模式(EAP)。

using System;
using System.ComponentModel;
using System.Net;

public class Example
{
    static void Main()
    {
        Console.WriteLine("Starting the download.\n");

        SingleDownload();
        Console.ReadLine();
    }

    public static void SingleDownload()
    {
        // Download the default URL to a temporary file.
        WebClient client = new WebClient();
        Uri uri = new Uri("http://www.contoso.com/library/homepage/images/homepage4.jpg");

        // Specify that the DownloadFileCallback method gets called when the download completes.
        client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCallback);

        // Specify a progress notification handler.
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback);
        client.DownloadFileAsync(uri, "Tempfile.jpg");
    }

    private static void DownloadFileCallback(object sender, AsyncCompletedEventArgs e)
    {
        // Process the downloaded file
        Console.WriteLine("The download complete.");
    }

    private static void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine("{0} percent download complete.", e.ProgressPercentage);
    }
}

在上面的示例中,使用了WebClient.DownloadFileAsync来异步下载一个图像文件,每当下载进度发生变化时,DownloadProgressChanged事件处理方法将调用,以更新进度。在完成后,DownloadFileCallback方法将处理已下载文件。最后,在Main方法中调用SingleDownload方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.NET2.0版本中基于事件的异步编程模式(EAP) - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • .NET 实现 JWT 登录验证

    .NET 实现JWT登录认证 在ASP.NET Core应用程序中,使用JWT进行身份验证和授权已成为一种流行的方式。JWT是一种安全的方式,用于在客户端和服务器之间传输用户信息。 添加NuGet包 首先,我们需要添加一些NuGet包来支持JWT身份验证。在您的ASP.NET Core项目中,打开Startup.cs文件,并在ConfigureService…

    C# 2023年4月17日
    00
  • C#面向对象编程中开闭原则的示例详解

    C#面向对象编程中开闭原则的示例详解 什么是开闭原则 开闭原则(Open-Closed Principle)是面向对象编程中的一个重要原则,其定义如下: 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 也就是说,在软件设计的过程中,可以通过扩展已有的代码来增加新的功能,而不需要修改原有的代码。 如何实现开闭原则 使用抽象类或接口 使用抽象类或接口可…

    C# 2023年5月31日
    00
  • newtonsoft.json解析天气数据出错解决方法

    下面是详细讲解“newtonsoft.json解析天气数据出错解决方法”的完整攻略: 问题描述 在使用newtonsoft.json库解析天气数据时出现了解析出错的情况。 常见错误信息 常见的错误信息包括但不限于以下内容:- JsonReaderException: Could not convert string to double: XXX- JsonR…

    C# 2023年5月14日
    00
  • C#实现线程池的简单示例

    下面是呈现 C#实现线程池的简单示例 的攻略。 一、什么是线程池 线程池是一种应对多线程编程,用于优化性能的一种技术。简而言之,线程池就是提前创建一堆线程,放入一个池子中,等待其他任务出现时就可以利用这些线程来处理它们,从而避免了每次出现任务时都需要创建新线程的开销。 二、.NET官方提供的线程池 .NET官方提供了ThreadPool类,该类提供了一个全局…

    C# 2023年6月7日
    00
  • C#影院售票系统毕业设计(1)

    下面逐步讲解“C#影院售票系统毕业设计(1)”的完整攻略。 1. 确定项目需求 要开发一个影院售票系统,需要满足以下需求: 用户端 用户可以通过图形化操作,实现选座、支付等功能; 可以查看影片排片信息、影院信息、个人信息等; 可以对已完成订单进行评价和投诉; 实现基本的安全性,如密码保护等。 管理员端 管理员可以通过图形化界面添加、修改、删除影片和影院信息;…

    C# 2023年6月1日
    00
  • Winform学生信息管理系统各子窗体剖析(3)

    首先需要明确一下,这篇文章是对Winform学生信息管理系统中各子窗体的剖析,本文分析的是第三部分,主要涉及的子窗体包括“学生公寓管理”、“学生缴费管理”、“学生考勤管理”和“学生成绩管理”。 学生公寓管理 学生公寓管理子窗体主要用于管理学生的住宿信息,包括宿舍楼、房间、住宿人员等信息。具体的功能如下: 宿舍楼管理:可以添加、修改、删除宿舍楼信息; 房间管理…

    C# 2023年6月2日
    00
  • C# 汉字转化拼音的简单实例代码

    让我为你详细讲解“C#汉字转化拼音的简单实例代码”的完整攻略。 概述 本文将介绍如何使用C#语言实现将汉字转换成拼音的功能。我们将使用一个开源项目,它提供了一个轻量级的拼音转换引擎。这个引擎能够在内存中快速地将汉字转换成拼音,同时支持多音字和注音符号。我们将使用这个引擎作为我们的核心。 步骤 1. 准备工作 首先,我们需要下载并引用 Pinyin4Net 项…

    C# 2023年6月7日
    00
  • asp.net 纯真ip库取得所在地实现代码

    下面我们来详细讲解如何实现“ASP.NET纯真ip库取得所在地实现代码”。 步骤一:下载纯真IP库 首先需要下载纯真IP库,可以在纯真IP数据库官网或者其他网站下载。下载完成后,解压缩得到一个.dat格式的文件。 步骤二:将IP库文件复制到项目中 将从官网上下载的IP库文件复制到项目中,推荐将此文件存放在项目下的/App_Data目录下。 步骤三:编写代码实…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部