首页 > 其他分享 >发布订阅 委托 事件

发布订阅 委托 事件

时间:2024-08-31 09:52:14浏览次数:12  
标签:订阅 委托 publisher Subscriber 事件 message public

LearnPlayground\PubSub\Program.cs


using System;

// 定义一个委托类型
public delegate void MyDelegate(string message);

public class Publisher
{
    // 定义一个事件,使用前面定义的委托类型
    public event MyDelegate OnMessagePublished;

    public void PublishMessage(string message)
    {
        Console.WriteLine("Publishing message: " + message);

        // 触发事件
        OnMessagePublished?.Invoke(message);
    }
}

public class Subscriber
{
    private Publisher publisher;

    public Subscriber(Publisher pub)
    {
        publisher = pub;
        // 订阅事件
        publisher.OnMessagePublished += OnMessageReceived;
        publisher.OnMessagePublished += OnMessageReceived2;
    }

    // 定义一个方法,该方法会在事件被触发时调用
    private void OnMessageReceived(string message)
    {
        Console.WriteLine("Subscriber received message: " + message);
    }
    private void OnMessageReceived2(string message)
    {
        Console.WriteLine("Subscriber received message2: " + message);
    }
}

/// <summary>
/// 发布器里面会有个委托类型的变量,
/// 在订阅器里面会将要需要触发的函数传递给发布器里面委托类型的变量,
/// 如何传入,会将发布器的示例作为订阅器构造函数的参数,然后在订阅器的构造函数里面将自己的一些方法,添加给(使用加等于符号)发布器的委托类型
/// </summary>
class Program
{
    static void Main(string[] args)
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber(publisher);
        // 发布消息
        publisher.PublishMessage("Hello, World!");
    }
}




LearnPlayground\PubSub\PubSub.csproj


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

LearnPlayground\LearnPlayground.sln

为什么使用 += 符号

在C#中,使用 += 符号来订阅事件有几个关键原因:

  1. 多重订阅

    • 使用 += 符号可以让你在同一事件上注册多个处理方法。每次事件触发时,所有注册的方法都会被依次调用。
    • 如果你不使用 += 而是直接使用赋值运算符 =,那么新注册的方法将会覆盖之前注册的所有方法。
  2. 线程安全

    • +=-= 运算符提供了线程安全的机制来添加和移除事件处理程序。这意味着即使在多线程环境中,也可以安全地添加或移除事件处理程序,而不会引起竞态条件。
  3. 简洁性

    • 使用 += 使得代码更加简洁明了,易于阅读和维护。

标签:订阅,委托,publisher,Subscriber,事件,message,public
From: https://www.cnblogs.com/zhuoss/p/18389902

相关文章

  • 【漏洞分析】OSN 代币攻击事件:一笔资金伪造多个分红大户
    背景OSN是一种feeontransfer代币,会根据用户分红账户的余额对用户发放分红。攻击者利用漏洞增发分红账户的余额,随后触发分红机制完成获利。OSN:https://bscscan.com/address/0x810f4c6ae97bcc66da5ae6383cc31bd3670f6d13#code攻击由三笔交易组成:https://app.blocksec.com/......
  • 【React】React事件和HTML事件的区别
    React写法<buttononClick={handleClick}>测试</button>HTML写法<buttononclick="handleClick()">测试</button>区别ReactHTML原生事件绑定方式小驼峰命名法,事件处理函数通过JSX语法直接绑定全小写形式定义事件处理函数函数引用内联的字符串表达式事件对象基于Ev......
  • webView中,无法利用JS监听APP原生返回后事件
    描述:用uniapp开发的APP,内容页用webView内嵌的h5做的;现在有个需求,在A页面点击新增,uni.navigateTo打开B页面,然后在B页面新增修改完数据之后,uni.navigateBack返回A页面;需要在A页面监听;当页面回到A的时候刷新数据;问题:在A页面用js无法监听到页面返回了;尝试监听方案:1、只能监听页面......
  • Windows安全日志分析实战:15个关键事件ID详解
    Windows安全日志分析实战:15个关键事件ID详解原创 VlangCN HW安全之路  2024年08月27日07:30 山东各位读者朋友们好,我是v浪。都2024年了,浪哥估计又阳了。但是没关系,今天同样大家带来一篇实用性很强的文章-Windows关键事件ID盘点。作为网络安全从业人员,了解这些......
  • 分享:JS事件循环机制,宏任务和微任务
     为什么会讲这个主题? 这要从一个bug讲起,10月26号,app端,我的考勤日历面板上的信息在ios上显示不全。效果见手机视频。 当时我们几个排查了2-3天都没找到原因,review代码各种改都不行。(此时打开代码看下,src/app/myAttendance/attendance.vueline298line246)最后通过setTimeo......
  • C++学习随笔——委托构造函数
    C++11中,引入了委托构造函数(delegatingconstructors)的概念。委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,以减少代码重复。 委托构造函数的语法:classMyClass{public:MyClass(intx):value(x){//这个构造函数初始化value}M......
  • openGauss-发布订阅
    openGauss-发布订阅可获得性本特性自openGauss3.0.0版本开始引入。特性简介发布订阅基于逻辑复制实现,其中有一个或者更多订阅者订阅一个发布者节点上的一个或者更多发布。订阅者从它们所订阅的发布拉取数据。实现集群间的数据实时同步。客户价值发布订阅的典型使用场景是:......
  • EventSource事件流(允许网页与服务器之间建立一个持久的连接,服务器可以通过这个连接向
     EventSource是JavaScript中用于处理服务器发送事件(Server-SentEvents,SSE)的接口。它允许网页与服务器之间建立一个持久的连接,服务器可以通过这个连接向客户端推送更新。EventSource通常用于需要实时更新数据的场景,比如实时通知、股票价格更新等。 基本用法//创建一......
  • 风控系统之事件溯源,决策流程记录与版本控制
    个人博客:无奈何杨(wnhyang)个人语雀:wnhyang共享语雀:在线知识共享Github:wnhyang-Overview背景一天,小明在风控管理台查看事件数据时,发现一笔决策结果为“拒绝”❌的交易事件,小明点开事件详情发现其触发了一条“24小时内向不同陌生账户转账超过30w”的规则,规则设置的处置方式是......
  • 鸿蒙开发实战:声明静态订阅应用规范
    静态订阅者在未接收订阅的目标事件时,处于未拉起状态,当系统或应用发布了指定的公共事件后,静态订阅者将被拉起,并执行onReceiveEvent回调。开发者可通过在onReceiveEvent回调中执行业务逻辑,实现当应用接收到特定公共事件时执行业务逻辑的目的。例如,某应用希望在设备开机的时......