.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日

相关文章

  • Unity屏幕雪花另类实现方式示例

    Unity屏幕雪花另类实现方式示例 本文将讲解一种实现Unity屏幕雪花效果的另类方式,通过GPU粒子效果实现屏幕雪花的飘落效果。下面将分为以下几个部分进行讲解: 需要的素材和脚本 实现效果的步骤 示例说明 需要的素材和脚本 在实现过程中我们需要以下素材和脚本: 雪花样本纹理 ScreenSnowEffect.shader ScreenSnowEffect.…

    C# 2023年6月3日
    00
  • C#托管堆对象实例包含内容分析

    C#托管堆对象实例包含内容分析 在C#中,对象实例是存储在堆上的,而且它们往往包含各种复杂的属性和字段。在这里,我们将探讨如何分析这些对象实例包含的内容。 调试工具 在C#中,Visual Studio是最常用的调试工具之一。使用Visual Studio,我们可以使用调试器来分析对象实例。以下是一些常用的调试器窗口: Locals窗口:此窗口显示当前方法中…

    C# 2023年6月1日
    00
  • asp.net 打印控件使用方法

    标题:ASP.NET打印控件使用方法 在ASP.NET开发过程中,打印控件是一个非常重要的组件。他可以方便用户进行在线的打印。本文将详细讲解ASP.NET中打印控件的使用方法。 打印控件引用 要使用ASP.NET中的打印控件,需要在页面中引用”System.Drawing.dll”和”System.Drawing.Printing.dll”这两个命名空间。 …

    C# 2023年6月3日
    00
  • C# 使用HttpClient上传文件并附带其他参数的步骤

    针对这个问题,我将按照以下结构来详细讲解如何使用C#的HttpClient上传文件并附带其他参数: 上传文件的基本步骤 附带其他参数的上传步骤 示例1:上传文件并附带一个简单参数 示例2:上传多个文件并附带多个参数 1. 上传文件的基本步骤 要使用HttpClient上传文件,需要进行以下步骤: 创建一个实例的HttpClient类 构建一个实例的Multi…

    C# 2023年6月1日
    00
  • ASP.NET CORE WEBAPI 登录 JWT 鉴权 ,接口权限验证

    JWT的简单使用 介绍 当今Web开发中,API的使用越来越广泛,而API的安全性也变得越来越重要。其中,JWT(JSON Web Token)鉴权和授权是一种常见的解决方案。 本篇文章将会介绍JWT鉴权和授权的原理、实现方式以及注意事项。 什么是JWT? JWT是一种基于JSON格式的开放标准(RFC7519),用于在网络上传递声明信息的一种简洁、自包含的…

    C# 2023年4月22日
    00
  • c# AES字节数组加密解密流程及代码实现

    下面是详细讲解“c# AES字节数组加密解密流程及代码实现”的攻略。 AES加密解密介绍 AES全称为Advanced Encryption Standard,高级加密标准,是一种对称加密算法。AES加密算法是美国超过15家组织共同研究的结果。其加密强度、安全性都很高,因此这种加密算法被广泛使用,如SSL/TLS协议加密、密码学中等等。 AES算法的加密和解…

    C# 2023年6月6日
    00
  • Windows 8 Metro用C#连接SQLite及创建数据库,数据表的增删改查的实现

    现在我会详细讲解“Windows 8 Metro用C#连接SQLite及创建数据库,数据表的增删改查的实现”的完整攻略,包括以下几个部分: 安装SQLite 引用SQLite库文件 创建数据库 创建数据表 实现数据的增删改查 接下来我将分别详细介绍每一个步骤。 安装SQLite SQLite是一个使用广泛的关系型数据库管理系统,它是一个可重用、嵌入式的库。在…

    C# 2023年6月2日
    00
  • C# 使用modbus 读取PLC 寄存器地址的方法

    C#是一种强类型编程语言,用于开发.NET框架下的应用程序。 Modbus是一种在工业自动化领域广泛使用的通讯协议,用于在PLC和其他设备之间进行通信。在本篇文章中,我们将详细讲解C#使用Modbus读取PLC寄存器地址的方法。 准备工作 在开始之前,必须做以下准备工作: 安装.Net框架; 准备好一个Modbus通讯的PLC设备; 下载和安装一个支持Mod…

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