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日

相关文章

  • C# 脚本引擎CS-Script的使用

    C# 脚本引擎CS-Script的使用 什么是CS-Script? CS-Script是一个用于扩展C#应用程序的开源脚本引擎。它允许您在不编译代码的情况下运行C#脚本,这使得C#脚本可以用于快速手动测试代码、构建脚本和部署小型工具等场合。 安装CS-Script 您可以使用NuGet安装CS-Script。在Visual Studio的“NuGet包管理器…

    C# 2023年6月3日
    00
  • C#实例代码之抽奖升级版可以经表格数据导入数据库,抽奖设置,补抽

    C#实例代码之抽奖升级版 本文将介绍一个C#实例代码,实现抽奖升级版,包括表格数据导入数据库、抽奖设置和补抽功能。 表格数据导入数据库 在抽奖升级版中,我们需要将抽奖名单导入数据库中,以便更好地管理和查询数据。以下是一个将表格数据导入数据库的示例: using System.Data; using System.Data.SqlClient; using E…

    C# 2023年5月15日
    00
  • 索泰RTX3070Ti X-GAMING OC怎么样 索泰RTX3070Ti X-GAMING OC显卡评测

    索泰RTX3070Ti X-GAMING OC 简介 索泰RTX3070Ti X-GAMING OC显卡是索泰公司推出的一款针对游戏玩家群体的高端显卡产品,采用了NVIDIA的最新核心芯片RTX3070Ti,并拥有多项技术特色。 评测过程 硬件配置 评测过程中,我们使用的测试配置如下: 处理器:AMD Ryzen 9 5950X 主板:ASUS ROG Cr…

    C# 2023年6月6日
    00
  • C#判等对象是否相等的方法汇总

    接下来我将为你详细讲解“C#判等对象是否相等的方法汇总”的完整攻略。 1. 前言 在C#中,对象相等判断是我们常见的操作之一。在实际应用中,我们可能会遇到很多情况需要判断两个对象是否相等,但是C#中的判断方式往往让我们比较困惑。因此,本篇文章总结了一些常用的判断方式,帮助您更好地理解和使用C#中的对象相等判断方法。 2. 常用的判断方式 2.1 == 和 !…

    C# 2023年6月1日
    00
  • C#以太网Sockets客户端设计实现

    C#以太网Sockets客户端设计实现 概述 C#以太网Sockets客户端是实现网络通信的好方法。使用C#语言和Socket API设计和实现以太网Sockets客户端非常简单。本攻略将介绍如何使用C#设计和实现以太网Sockets客户端。 设计与实现步骤 步骤1:创建Socket对象 首先,需要创建一个Socket对象来处理网络连接。以下代码演示如何创建…

    C# 2023年6月1日
    00
  • 在 .NET MAUI 中加载 json 文件的方法

    以下是关于在.NET MAUI中加载JSON文件的方法的完整攻略: 1. 问题描述 在.NET MAUI应用程序中,我们需要加载JSON文件以便读取其中的数据。本攻略将介绍如何在.NET MAUI中加载JSON文件。 2. 解决方案 在.NET MAUI中,我们可以使用System.Text.Json命名空间中的JsonSerializer类来加载JSON文…

    C# 2023年5月12日
    00
  • ASP.NET 生成静态页面 实现思路

    以下是关于“ASP.NET 生成静态页面 实现思路”的完整攻略。 什么是ASP.NET生成静态页面 在ASP.NET中,页面的内容通常是由ASP.NET引擎动态生成的。当用户请求ASPX页面时,服务器端ASP.NET引擎会解析页面中的代码,并将其转换为HTML代码,最终呈现在用户的浏览器中。但是,这种动态生成的方式会增加服务器的负担,并且对于搜索引擎的抓取也…

    C# 2023年6月3日
    00
  • C#面向对象编程中接口隔离原则的示例详解

    下面是针对“C#面向对象编程中接口隔离原则的示例详解”的完整攻略: 接口隔离原则(ISP)概述 ISP是指:不应该被强迫依赖那些他们不需要使用的接口。简单来说,该原则指出一个类或模块不应该依赖那些它不需要的接口,这样可以使得系统具有更好的松耦合性和更高的灵活性。 在C#编程中,接口往往是将一个大型的类分解成若干个更小的、更专一的类的重要手段。在使用接口的同时…

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