LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 高效实现事件发布与订阅功能

admin
2025年5月7日 0:43 本文热度 318

前言

在现代软件开发中,事件驱动架构(Event-Driven Architecture, EDA) 以其高度解耦、灵活扩展的特性被广泛应用于桌面应用、Web服务、微服务架构等多个领域。其中,事件的发布与订阅机制是实现模块间通信的核心手段之一。

本文将通过一个完整的代码示例,帮助你理解并掌握如何使用 C# 实现一个简易但功能完整的事件发布与订阅系统

核心概念:什么是委托与事件?

在深入编码之前,我们先来了解两个关键概念:

委托(Delegate)

委托就像一个“方法容器”,可以用来引用一个或多个具有相同签名的方法,并在需要时调用它们。

public delegate void EventHandler(string message);

这表示一个名为 EventHandler 的委托,它接受一个字符串参数,没有返回值。

事件(Event)

事件是对委托的一种封装,用于限制外部直接调用委托,只能通过 += 和 -= 来添加或移除事件处理程序,从而提升安全性。

实现步骤详解

第一步:声明委托

定义一个用于事件处理的委托类型。

public delegate void MessageEventHandler(string message);

第二步:定义事件发布者(Publisher)

这是一个包含事件并负责触发事件的类。

public class Publisher
{
    // 声明事件
    public event MessageEventHandler OnMessagePublished;

    // 触发事件的方法
    public void Publish(string message)
    {
        // 使用空条件操作符安全调用事件
        OnMessagePublished?.Invoke(message);
    }
}

第三步:定义事件订阅者(Subscriber)

订阅者通过绑定到事件来响应发布的消息。

public classSubscriber
{
    public void Subscribe(Publisher publisher)
    {
        // 订阅事件
        publisher.OnMessagePublished += HandleMessage;
    }

    private void HandleMessage(string message)
    {
        Console.WriteLine($"收到消息: {message}");
    }

    public void Unsubscribe(Publisher publisher)
    {
        // 取消订阅事件
        publisher.OnMessagePublished -= HandleMessage;
    }
}

第四步:主程序测试运行

class Program
{
    static void Main(string[] args)
    {
        var publisher = new Publisher();
        var subscriber = new Subscriber();

        // 订阅事件
        subscriber.Subscribe(publisher);

        // 发布事件
        publisher.Publish("Hello, world!");

        Console.ReadLine();
    }
}

运行后输出:

收到消息: Hello, world!

完整代码整合如下:

using System;

namespaceEventDemo
{
    // 1. 声明委托
    public delegate void MessageEventHandler(string message);

    // 2. 定义发布者
    publicclassPublisher
    {
        publicevent MessageEventHandler OnMessagePublished;

        public void Publish(string message)
        {
            OnMessagePublished?.Invoke(message);
        }
    }

    // 3. 定义订阅者
    publicclassSubscriber
    {
        public void Subscribe(Publisher publisher)
        {
            publisher.OnMessagePublished += HandleMessage;
        }

        private void HandleMessage(string message)
        {
            Console.WriteLine($"收到消息: {message}");
        }

        public void Unsubscribe(Publisher publisher)
        {
            publisher.OnMessagePublished -= HandleMessage;
        }
    }

    // 4. 主程序入口
    classProgram
    {
        static void Main(string[] args)
        {
            var publisher = new Publisher();
            var subscriber = new Subscriber();

            subscriber.Subscribe(publisher);

            publisher.Publish("Hello, world!");

            Console.ReadLine();
        }
    }
}

深入理解:事件 vs 委托

特性
委托
事件
定义方式
可以单独定义
必须依附于类内部
外部访问控制
允许外部直接调用
仅允许通过 += / -= 修改订阅者
使用场景
方法回调,多用于函数式编程
组件间通信,适用于松耦合设计
线程安全
需手动处理
推荐使用空条件调用确保安全

进阶建议

使用泛型事件参数:可以自定义 EventArgs 类型传递更复杂的数据。

多线程环境支持:结合 EventHandler<TEventArgs> 和线程同步机制提高并发性能。

使用 .NET 内置事件模型:如 EventHandler 和 EventArgs 提供更好的兼容性和规范性。

事件聚合器模式:适合大型项目中统一管理事件通信。

总结

通过本文的学习,应该已经掌握了以下内容:

  • 如何使用 C# 中的 委托和事件 构建基本的事件发布与订阅机制;

  • 事件的本质是基于委托的一层封装,提供了更高的访问安全性和良好的设计模式;

  • 在实际开发中,合理使用事件可以有效降低模块间的耦合度,使系统更加灵活、可维护。

掌握事件的声明、触发、订阅和取消订阅是每个开发人员必备的技能。不管是开发 WinForm、WPF、.NET WebAPI还是搭建复杂的后台服务,事件驱动都是一种不可或缺的编程思想。


阅读原文:https://mp.weixin.qq.com/s/X1FPLW1lURzMxO950UdGKw


该文章在 2025/5/7 17:54:41 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved