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

相关文章

  • C#多线程编程中的锁系统基本用法

    接下来就为大家详细讲解C#多线程编程中的锁系统基本用法的完整攻略。 什么是锁(Lock) 锁用于多线程编程中,是一种用于避免竞争访问共享资源的同步机制。在多线程程序中,多个线程可能同时访问同一个共享资源,如果不采取任何措施,就会产生“竞态条件”,导致程序出现不可预期问题。 为了避免这种情况,我们可以引入锁机制,来确保只有一个线程能够同时访问共享资源,从而避免…

    C# 2023年5月15日
    00
  • c# Random快速连续产生相同随机数的解决方案

    让我详细讲解一下 “c# Random快速连续产生相同随机数的解决方案”。 背景 在编写 C# 相关程序过程中,我们通常需要用到Random类来生成随机数。但是,有时候我们可能会碰到连续生成相同的随机数的情况,这显然是不符合我们的期望的。 解决方案 解决这个问题的方法有很多种,下面我将介绍两种比较常用的方法。 1. 添加随机种子 我们可以为 Random 类…

    C# 2023年6月1日
    00
  • C#访问C++动态分配的数组指针(实例讲解)

    初步分析这个问题,我们可以将其分为以下几个部分来进行回答: 什么是C++动态分配的数组指针? 为什么需要使用C#来访问C++动态分配的数组指针? 怎么使用C#来访问C++动态分配的数组指针? 示例说明。 下面逐一进行回答。 1. 什么是C++动态分配的数组指针? C++中的数组指针,是指指向数组的指针。动态分配的数组指针是指,程序在运行时根据需要动态分配内存…

    C# 2023年6月7日
    00
  • Entity Framework Core种子数据Data-Seeding

    Entity Framework Core是.NET Core平台下常用的ORM框架,提供了强大的数据访问功能,但在实际开发中,我们还需要进行一些初始化数据的操作,例如数据库表中的种子数据。Entity Framework Core提供了Data Seeding的机制,帮助我们实现种子数据初始化操作,下面是完整攻略: 步骤1:创建DbContext 在实现D…

    C# 2023年5月31日
    00
  • C# 删除数组内的某个值、一组值方法详解

    下面是关于“C# 删除数组内的某个值、一组值方法详解”的完整攻略。 1.题目理解 首先,让我们理解题目的含义。该题目要求我们使用C#编写一个可以删除一个数组内的某个值或一组值的方法。 2.方法介绍 我们可以使用以下两种方法来删除数组内的某个值或一组值。 2.1.使用LINQ方法 使用LINQ方法进行数组的删除,主要是使用Where()和ToArray()函数…

    C# 2023年6月1日
    00
  • C#后台接受前台JSON字符串装换成字典集合处理

    C#后台接收前台JSON字符串,可以通过Newtonsoft.Json等第三方库实现。下面是一些处理JSON字符串的实践方案。 1. 将JSON字符串转化为字典(Dictionary)集合 可以先定义一个自定义类的静态方法,将JSON数据作为参数传入,通过Newtonsoft.Json库中的JsonConvert.DeserializeObject方法将JS…

    C# 2023年5月31日
    00
  • FtpHelper实现ftp服务器文件读写操作(C#)

    FtpHelper实现ftp服务器文件读写操作(C#) 简介 FtpHelper是一个C#编写的FTP工具,用于实现FTP服务器文件的读写操作。本文将介绍使用FtpHelper进行FTP文件读写操作的方法。 安装 使用NuGet包管理器安装FtpHelper Install-Package FtpHelper 连接FTP服务器 使用FtpHelper连接FT…

    C# 2023年6月1日
    00
  • C#部署数据库及IIS站点

    部署C#数据库和IIS站点是C#开发过程中非常关键的一环,下面是一个完整的攻略。 步骤一:安装SQL Server和IIS 首先,我们需要安装SQL Server和IIS。SQL Server是一个强大的关系型数据库服务器,而IIS是一个网页服务器。 安装SQL Server 下载SQL Server并运行安装程序。 在安装向导中选择要安装的组件。建议选择包…

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