C#基于自定义事件EventArgs实现发布订阅模式

关于 "C#基于自定义事件EventArgs实现发布订阅模式" 的完整攻略,可以从以下几个方面讲解:

一、理解发布订阅模式

简单来说,发布订阅模式(Publish/Subscribe Pattern,又称为观察者模式)是一种消息模型,其中一个消息的发布者 (Publisher) 不会直接向某个特定的订阅者 (Subscriber) 发送消息,而是发布(广播)事件给所有订阅者,订阅者可以自己选择性消费这些事件。它常被用于异步消息处理和事件驱动系统中。

二、应用自定义事件args

C#的事件封装的非常好,事件需要一个委托类型和一个事件名,类似于:

public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler SomethingHappened;

其中 SomethingHappened 就是一个事件名,它关联了一个委托类型 EventHandler,它要求传递两个参数:object senderEventArgs e,其中 EventArgs 是一个空类,表示事件接收者(订阅者)所关心的信息为空。

我们可以基于自定义的 EventArgs 类型来实现自定义事件模型。首先需要定义自定义 EventArgs 类型,如:

public class CustomEventArgs : EventArgs
{
    public string Message { get; set; }
    public int Code { get; set; }
}

然后,事件委托的定义注意,委托的第二个参数使用自定义的 CustomEventArgs 类:

public class Publisher
{
    public delegate void SomethingHappenedEventHandler(object sender, CustomEventArgs e);
    public event SomethingHappenedEventHandler SomethingHappened;

    public void DoSomething(int code, string message)
    {
        Console.WriteLine("Start to do something.");
        Thread.Sleep(2000); // 模拟处理过程
        // 发布事件给订阅者
        OnSomethingHappened(new CustomEventArgs { Code = code, Message = message });
    }

    protected virtual void OnSomethingHappened(CustomEventArgs e)
    {
        SomethingHappened?.Invoke(this, e);
    }
}

三、实现发布订阅模式

发布订阅模式的实现步骤如下:

  1. 定义一个 Publisher 类,包含一个自定义事件,以及发起事件的方法。
  2. 定义一个 Subscriber 类,事件处理方法。
  3. 创建 Publisher 的实例对象,并将多个 Subscriber 订阅上它的事件。
  4. 调用 Publisher 的发起事件方法,它会自动通知已订阅的 Subscriber 对象。

示例一:

public class SubscriberA
{
    public void HandleEvent(object sender, CustomEventArgs e)
    {
        Console.WriteLine($"SubscriberA received event (Code={e.Code}, Message={e.Message}).");
    }
}

public class SubscriberB
{
    public void HandleEvent(object sender, CustomEventArgs e)
    {
        Console.WriteLine($"SubscriberB received event (Code={e.Code}, Message={e.Message}).");
    }
}

// 创建发布者对象
Publisher publisher = new Publisher();

// 创建订阅者对象
SubscriberA subA = new SubscriberA();
SubscriberB subB = new SubscriberB();

// 将订阅者对象订阅到发布者对象的事件上
publisher.SomethingHappened += subA.HandleEvent;
publisher.SomethingHappened += subB.HandleEvent;

// 做一些处理,发起事件
publisher.DoSomething(200, "This is a message.");

// 取消订阅
publisher.SomethingHappened -= subB.HandleEvent;

// 再次发起事件
publisher.DoSomething(201, "Another message.");

示例二:

public class SubscriberC
{
    public void HandleEvent(object sender, CustomEventArgs e)
    {
        Console.WriteLine($"SubscriberC received event (Code={e.Code}, Message={e.Message}).");
        // 事件处理过程中,如果需要调用其他外部接口做进一步处理,都可以在发布订阅模式的“订阅事件处理”中添加相关逻辑。
    }
}

Publisher publisher = new Publisher();
SubscriberC subC = new SubscriberC();
publisher.SomethingHappened += subC.HandleEvent;

publisher.DoSomething(202, "This is another message.");

publisher.SomethingHappened -= subC.HandleEvent;

四、总结

在实际开发中,应用发布订阅模式可以帮助解耦,也可以帮助实现复杂的异步逻辑。自定义事件args的使用,可以方便我们处理一些需要传递的数据,更加灵活。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于自定义事件EventArgs实现发布订阅模式 - Python技术站

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

相关文章

  • unity将图片转换成字体的方法

    转换图片成字体,可以使用Unity的TextMesh Pro插件。下面是具体的步骤: 1. 安装TextMesh Pro 插件 在Unity Asset Store中搜索“TextMesh Pro”并下载安装 2. 创建一个新的TextMesh Pro字体 在菜单栏中依次选择TextMeshPro -> Font Asset Creator,打开字体生…

    C# 2023年6月3日
    00
  • C#分析URL参数并获取参数和值对应列表的方法

    下面是关于“C# 分析 URL 参数并获取参数和值对应列表的方法”的完整攻略。 分析URL参数并获取参数和值对应列表的方法 在 C# 中分析 URL 参数并获取参数和值对应列表的方法可以使用System.Web.HttpUtility.ParseQueryString方法。下面是详细的介绍流程: 引用 System.Web 命名空间。 csharp usin…

    C# 2023年6月7日
    00
  • C#:使用ffmpeg将图片合并成视频

      最近遇到公司的一个项目,需要将多张图片合并成一个播放的视频,找了很多资料和尝试了工具,遇到很多的坑,这里记下来,希望大家也能顺利解决遇到的问题。   合并视频,主要可以借用OpenCV 和 ffmpeg,这里是尝试用ffmpeg.exe的工具去实现图片文件合并成视频。   输入存储视频文件的路径,通过ProcessStartInfo 调用ffmpeg.e…

    C# 2023年5月5日
    00
  • .NET Core中依赖注入AutoMapper的方法示例

    .NET Core中依赖注入AutoMapper的方法示例 AutoMapper是常用于对象映射的库,它可以方便地将一个对象的属性映射到另一个对象中。使用依赖注入(Dependency Injection,DI)可以将AutoMapper集成到.NET Core中,使其更加易于使用和管理。 第一步:安装AutoMapper和AutoMapper.Extens…

    C# 2023年6月3日
    00
  • 详解如何选择使用ArrayList、HashTable、List、Dictionary数组

    选择使用ArrayList、HashTable、List、Dictionary数组需要从以下几个方面考虑: 数据类型的支持:要使用哪些数据类型作为数组元素或键值。 数据的大小:数据量是否较大,是否需要动态添加或删除元素。 数据的查找方式:是否需要快速通过键值查找对应的元素。 数据的访问方式:是否需要按照顺序访问元素,或者需要按照键值访问元素。 根据上述考虑因…

    C# 2023年6月6日
    00
  • C#基于正则表达式删除字符串中数字或非数字的方法

    针对这个问题,我会提供以下完整攻略: 步骤一:学习正则表达式 首先,在使用正则表达式来删除字符串中数字或非数字之前,需要了解正则表达式相关的规则。正则表达式是用特定语言描述某类字符串的表达式,包括通用元字符、限定符、转义字符等一系列元素,使用的时候需要匹配和替换相应的规则。参考资料有 菜鸟教程 和 W3School。 步骤二:运用C#语言的string.Re…

    C# 2023年6月8日
    00
  • Unity打开淘宝app并跳转到商品页面功能的实现方法

    要实现Unity打开淘宝App并跳转到商品页面的功能,可以通过Unity调用Android或iOS原生代码的方式来实现。下面分别介绍一下Android和iOS平台的实现方法: Android平台 在Unity中创建一个调用Java代码的C#脚本,并添加以下代码: using UnityEngine; using System.Collections; usi…

    C# 2023年6月3日
    00
  • C#生成随机字符串的实例

    讲解“C#生成随机字符串的实例”的完整攻略包含以下几个步骤: 引入命名空间:首先需要引入 System.Security.Cryptography 命名空间,这个命名空间提供了 RNGCryptoServiceProvider 类,可以生成真正的随机数。 创建 RNGCryptoServiceProvider 类对象:创建一个 RNGCryptoServic…

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