当前位置: 首页 > news >正文

C# 简单模拟 程序内部 消息订阅发布功能

文章目录

  • 前言
  • 模拟消息订阅发布
    • 使用
    • 注意事项

前言

我想做个简单的消息发布订阅功能,但是发现好像没有现成的工具类。要么就是Mqtt这种消息订阅发布。但是我只想程序内部进行消息订阅发布,进行程序的解耦。那没办法了,只能自己上了

模拟消息订阅发布

在Utils 的MessageHelper
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace NetCore.Utils
{public class MessageHelper{public static List<Message> Messages = new List<Message>();/// <summary>/// 消息订阅/// </summary>public static void Subscribe(string topic, string key, Action<object> action){var model = Messages.Where(item => item.Topic == topic && item.Key == key).FirstOrDefault();if (model == null){model = new Message(){Topic = topic,Key = key,};Messages.Add(model);model.Actions.Add(action);}else if(model.Actions.Find(item => item.Equals(action)) == null){model.Actions.Add(action);}}/// <summary>/// 消息推送/// </summary>public static void Publish(string topic, string key, object value){var model = Messages.Where(item => item.Topic == topic && item.Key == key).FirstOrDefault();if (model != null){model.Actions.ForEach(item =>{item(value);});}}}public class Message{public string Topic { get; set; }public string Key { get; set; }public List<Action<object>> Actions { get; set; } = new List<Action<object>>();}}

使用

static void Main(string[] args)
{MessageHelper.Subscribe("Topic1", "key1", (res) =>{var _res = ((string Name, int Age))res;Console.WriteLine(_res.ToString());Console.WriteLine("我被调用了1");});MessageHelper.Subscribe("Topic2", "key1", (res) =>{Console.WriteLine("我被调用了2");});MessageHelper.Subscribe("Topic3", "key1", (res) =>{Console.WriteLine("我被调用了3");});MessageHelper.Subscribe("Topic4", "key1", (res) =>{Console.WriteLine("我被调用了4");});MessageHelper.Publish("Topic1","key1",(Name:"嘟嘟",Sex:"12"));Console.ReadLine();}

注意事项

这里我用了元祖来进行临时变量的传值。元祖如何使用请看我的另一篇文章。元祖用来做临时变量特别好用

C# 元祖,最佳的临时变量。

为了防止重复注入,我加了判断代码。

相关文章:

C# 简单模拟 程序内部 消息订阅发布功能

文章目录 前言模拟消息订阅发布使用注意事项 前言 我想做个简单的消息发布订阅功能&#xff0c;但是发现好像没有现成的工具类。要么就是Mqtt这种消息订阅发布。但是我只想程序内部进行消息订阅发布&#xff0c;进行程序的解耦。那没办法了&#xff0c;只能自己上了 模拟消息…...

第六章 支持向量机

文章目录 支持向量机间隔和支持向量对偶问题问题推导SMO 核函数实验 支持向量机 ⽀持向量机&#xff08;Support Vector Machines&#xff0c;SVM&#xff09; 优点&#xff1a;泛化错误率低&#xff0c;计算开销不⼤&#xff0c;结果易解释。缺点&#xff1a;对参数调节和核…...

Docker基本操作之删除容器Container和删除镜像IMAGE

一、删除容器Container语法 docker rm [OPTIONS] CONTAINER [CONTAINER...]OPTIONS参数说明&#xff1a; -f :通过 SIGKILL 信号强制删除一个运行中的容器。【注意是正在运行的容器实例】-l :移除容器间的网络连接&#xff0c;而非容器本身。-v :删除与容器关联的卷。即删除容…...

vue 3.0 + element-ui MessageBox弹出框的 让文本框显示文字 placeholder

inputPlaceholder:请填写理由, 方法实现如下: this.$prompt(, 是否确认&#xff1f;, { confirmButtonText: 确定, cancelButtonText: 取消, inputPlaceholder:请填写理由, }).then(({ value }) > { if(value null || value ""){ Message({message: 请填…...

QT生成可执行文件的步骤

QT生成可执行文件的步骤 第一步&#xff1a;debug为release&#xff0c;然后进行编译 第二步&#xff1a;添加QT生成必要的库 首先&#xff0c;建立一个新的文件夹&#xff0c;然后将Release中的可执行文件拷贝到新的文件夹中 然后&#xff0c;在新建文件夹中生成必要的库 …...

一分钟学会JS获取当前年近五年的年份

先看效果图 上代码&#xff1a; 1、HTML <div><el-date-pickerv-model"queryYearXmgk.startYear"format"yyyy"value-format"yyyy"type"year"placeholder"开始"clearable:picker-options"pickerStartAuditYe…...

14 springboot项目——首页跳转实现

templates里的静态资源无法访问&#xff0c;需要写mvc的配置类或者改application.xml配置文件实现首页访问。这两个方式用其中一种即可&#xff0c;否则会冲突。 14.1 首页跳转方式一 创建配置类&#xff0c;在config包中创建一个mvc的配置类&#xff1a; package jiang.com.s…...

IL汇编语言读取控制台输入和转换为整数

新建一个testcvt.il&#xff1b; .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 1.entrypointldstr "\n请输入一个数字:"call void [mscorlib]System.Console::Write(string)call st…...

什么是跨链 DeFi?

跨链 DeFi 是指存在于多个不同区块链生态系统之间的金融应用程序生态系统&#xff0c;可以在彼此之间无缝交换数据和通证。 Web3 生态系统已经变得多链化&#xff0c;存在于数百个区块链、二层网络、应用链和其他环境的去中心化应用繁荣发展。虽然多样化的区块链生态系统的推出…...

Linux下C/C++的gdb工具与Python的pdb工具常见用法之对比

1、gdb和pdb分别是什么&#xff1f; 1.1、gdb GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的命令行调试工具&#xff0c;由GNU项目开发&#xff0c;用于调试C、C等编程语言的程序。它在多个操作系统中都可以使用&#xff0c;包括Linux、MacOS和Windows&#xff0…...

从入门到专业:探索Python中的判断与循环技巧!

文章目录 判断语句布尔类型和比较运算符if语句的基本格式练习案例&#xff1a;成年人判断if else语句if elif else语句判断语句的嵌套案例&#xff1a;猜数字 循环语句while循环的基础语法while循环的基础案例while循环的嵌套应用补充&#xff1a;print输出不换行&\tfor循环…...

mqtt、tcp、http的区别

文章目录 一、MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;1、类型2、用途 二、TCP&#xff08;Transmission Control Protocol&#xff09;1、类型2、用途 三、HTTP&#xff08;Hypertext Transfer Protocol&#xff09;1、类型2、用途 四、主要区别1、类…...

边写代码边学习之RNN

1. 什么是 RNN 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种以序列数据为输入来进行建模的深度学习模型&#xff0c;它是 NLP 中最常用的模型。其结构如下图&#xff1a; x是输入&#xff0c;h是隐层单元&#xff0c;o为输出&#xff…...

在linux调试进程PID的方法

当我们谈论调试 PID&#xff08;进程标识符&#xff09;时&#xff0c;我们通常是指诊断和解决与操作系统中的特定进程相关的问题。有许多工具和方法可用于调试 PID&#xff0c;以下是一些常见的方法&#xff1a; 1. 使用ps命令 ps命令是最基本的调试工具&#xff0c;用于查看…...

【并发编程】线程安全的栈容器

std::stack容器的接口包括 empty(), size(), top(), push(), pop()等。 问题 其原接口在多线程的情况下&#xff0c;会持续很多问题。 例如&#xff0c;在std::stack容器的接口中&#xff0c;在多线程下应用时&#xff0c;empty()和size()的结果是不可信的。因为尽管在某线程…...

ES嵌套查询和普通查询的高亮显示区别

在 Elasticsearch 中&#xff0c;高亮显示是一种强大的搜索结果可视化工具&#xff0c;它可以帮助我们快速识别匹配的关键字或短语。在ES中&#xff0c;我们可以使用两种不同的查询方式来实现高亮显示&#xff1a;嵌套查询和普通查询。本文探讨这两种查询方式的高亮显示区别以及…...

Greenplum集群部署

一,安装说明 1.1环境说明 *名称**版本*操作系统CentOS 7.6 64bitgreenplumgreenplum-db-6.10.1-rhel7-x86_64.rpm1.2集群介绍 IPhostname集群节点10.240.3.244gpmastermaster10.240.3.245gpsegment1segment10.240.3.246gpsegment2segment二,安装环境准备 2.1 修改各节点名称…...

电教智能云数据可视化平台开发电能优化日志实录

电教智能云数据可视化平台开发电脑优化日志实录 一、2K和4K弹窗判断二、电能API对接1.电脑爬虫2.电能分组过滤3.数据可视化渲染4.弹窗 三.数组按顺序输出 一、2K和4K弹窗判断 {* 判断2k和4k弹窗 *}{if $dataScene[scene_standard] eq 0}<a class"menuBtn subMenu"…...

JSX语法基础总结

题记&#xff1a;首先我们要了解一下jsx是什么&#xff0c;跟js有什么区别&#xff0c;其实就是js的语法糖&#xff0c;加上了xml的语法&#xff0c;使得产生虚拟dom更加的方便&#xff0c;简单说一下&#xff0c;xml就是存储数据的格式&#xff0c;想了解xml的话&#xff0c;可…...

socker套接字

1.打印错误信息 2.socketaddr_in结构体 结构体&#xff1a; &#xff08;部分库代码&#xff09; (宏中的##) 3.manual TCP: SOCK_STREAM &#xff1a; 提供有序地&#xff0c;可靠的&#xff0c;全双工的&#xff0c;基于连接的流式服务 UDP: 面向数据报...

5分钟快速上手:Parsec VDD虚拟显示器完整指南,彻底释放游戏串流潜能

5分钟快速上手&#xff1a;Parsec VDD虚拟显示器完整指南&#xff0c;彻底释放游戏串流潜能 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 想要在没有物理显示器的情况下畅享4K游…...

谷歌外链怎么发?靠1种图文形式自动吸引外链

写外链一直是SEO里最耗体力的活。很多公司招了三个实习生&#xff0c;每天坐在电脑前发几百封开发信&#xff0c;回复率往往不到0.5%。到了2026年&#xff0c;谷歌的算法已经能识别出绝大多数带有“交换”性质的人为链接。现在的行情是&#xff0c;想要稳住排名&#xff0c;得让…...

YOLOv8模型家族全解析:P2、P6、标准版到底该选哪个?一张图帮你搞定选择困难症

YOLOv8模型家族全解析&#xff1a;P2、P6、标准版到底该选哪个&#xff1f; 在计算机视觉项目的初期&#xff0c;模型选型往往是最令人头疼的环节。面对GitHub仓库中琳琅满目的YAML配置文件&#xff0c;即便是经验丰富的工程师也难免陷入选择困难。YOLOv8作为当前最先进的目标检…...

3大突破:AEUX如何重塑设计到动画的无缝工作流

3大突破&#xff1a;AEUX如何重塑设计到动画的无缝工作流 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX 在数字创意领域&#xff0c;设计师们长期面临着一个令人沮丧的现实&#xff1a…...

解放双手!用STAR-CCM+的3D-CAD模块快速清理与简化仿真几何(保姆级教程)

解放双手&#xff01;用STAR-CCM的3D-CAD模块快速清理与简化仿真几何&#xff08;保姆级教程&#xff09; 在CAE仿真领域&#xff0c;几何模型的质量往往直接决定仿真效率与结果可靠性。许多工程师都有过这样的经历&#xff1a;从设计部门拿到一个细节完美的CAD模型&#xff0c…...

Camunda并行会签实战:从BPMN设计到数据库状态变化的完整追踪

Camunda并行会签实战&#xff1a;从BPMN设计到数据库状态变化的完整追踪 在复杂业务流程自动化领域&#xff0c;并行会签是一种常见但实现难度较高的模式。当三个部门主管需要同时审批一份采购申请时&#xff0c;传统串行审批会导致效率低下&#xff0c;而并行处理又面临状态同…...

【广东工业大学主办,阿布扎比大学支持举办 | JPCS 出版|EI,Scopus稳定双检索 | 连续多年EI稳定见刊检索】 第十届能源、环境与材料科学国际学术会议(EEMS 2026)

第十届能源、环境与材料科学国际学术会议(EEMS 2026&#xff09; 2026 10th International Conference on Energy, Environment and Materials Science 大会时间&#xff1a;2026年7月10-12日 大会地点&#xff1a;广东广州 会议官网&#xff1a;​​​​​​www.ic-eems…...

别再从头训练了!用SAM-Adapter‘轻量化’微调,让你的分割模型快速适配新任务

SAM-Adapter&#xff1a;轻量化微调技术让图像分割模型快速适配新任务 在计算机视觉领域&#xff0c;Segment Anything Model&#xff08;SAM&#xff09;的出现无疑掀起了一场分割技术的革命。这个由Meta推出的基础模型&#xff0c;以其惊人的零样本泛化能力震撼了整个行业。然…...

深入解析C/C++栈空间:Windows/Linux默认大小、设置方法与溢出防御实战

1. 栈空间&#xff1a;一个被忽视的“内存边界”写C/C代码&#xff0c;尤其是涉及到递归、大数组或者复杂函数调用时&#xff0c;你肯定遇到过“栈溢出”&#xff08;Stack Overflow&#xff09;这个老朋友。它不像内存泄漏那样悄无声息&#xff0c;而是直接给你一个程序崩溃&a…...

auditd:Linux 系统审计日志,记录谁动了你的服务器

auditd&#xff1a;Linux 系统审计日志&#xff0c;记录谁动了你的服务器 服务器被入侵后&#xff0c;管理员面临的第一个问题往往不是"怎么修复"&#xff0c;而是"到底发生了什么"——攻击者登录了哪个账号&#xff1f;修改了哪些文件&#xff1f;执行了什…...