当前位置: 首页 > 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# 元祖,最佳的临时变量。

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

http://www.lryc.cn/news/110588.html

相关文章:

  • 第六章 支持向量机
  • Docker基本操作之删除容器Container和删除镜像IMAGE
  • vue 3.0 + element-ui MessageBox弹出框的 让文本框显示文字 placeholder
  • QT生成可执行文件的步骤
  • 一分钟学会JS获取当前年近五年的年份
  • 14 springboot项目——首页跳转实现
  • IL汇编语言读取控制台输入和转换为整数
  • 什么是跨链 DeFi?
  • Linux下C/C++的gdb工具与Python的pdb工具常见用法之对比
  • 从入门到专业:探索Python中的判断与循环技巧!
  • mqtt、tcp、http的区别
  • 边写代码边学习之RNN
  • 在linux调试进程PID的方法
  • 【并发编程】线程安全的栈容器
  • ES嵌套查询和普通查询的高亮显示区别
  • Greenplum集群部署
  • 电教智能云数据可视化平台开发电能优化日志实录
  • JSX语法基础总结
  • socker套接字
  • No111.精选前端面试题,享受每天的挑战和学习
  • 【Apollo学习笔记】—— 相机仿真
  • 【数据结构】——线性表的相关习题
  • SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)
  • SpringBoot复习:(19)Condition接口和@Conditional注解
  • K8s中的Controller
  • 【MFC】03.常用复杂控件的使用-笔记
  • Autosar诊断实战系列14-NRC优先级解析
  • 《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB产品特性,架构和应用场景
  • xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。
  • 机器学习06 数据准备-(利用 scikit-learn基于Pima Indian数据集作 数据特征选定)