WPF中使用路由模式处理Mqtt消息
直接上代码特征[AttributeUsage(AttributeTargets.Method,AllowMultipletrue,Inheritedfalse)]publicclassMqttTopicAttribute:Attribute{publicstringTopic{get;}/// summary/// 描述可选用于日志/文档/// /summarypublicstringDescription{get;set;};publicMqttTopicAttribute(stringtopic){if(string.IsNullOrWhiteSpace(topic))thrownewArgumentException(Topic 不能为空,nameof(topic));Topictopic;}}注册路由/// summary/// 路由注册/// /summarypublicclassMqttRouteRegistry{publicDictionarystring,List(Type ServiceType,MethodInfo Method)Routes{get;}new(StringComparer.OrdinalIgnoreCase);publicvoidScanAssembly(Assemblyassembly){foreach(vartypeinassembly.GetTypes()){varmethodstype.GetMethods(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic);foreach(varmethodinmethods){//使用 GetCustomAttributes 获取方法上贴的所有 MqttTopic 特性varattributesmethod.GetCustomAttributesMqttTopicAttribute();foreach(varattributeinattributes){// 验证方法签名必须包含且仅包含一个 stringvarparametersmethod.GetParameters();// 校验参数类型是否为 MqttMessageContextif(parameters.Length!1||parameters[0].ParameterType!typeof(MqttMessageContext)){thrownewInvalidOperationException($[MqttTopic] 方法{type.Name}.{method.Name}必须有且仅有一个 MqttMessageContext 参数);}// 验证返回值if(method.ReturnType!typeof(Task)method.ReturnType!typeof(void)){thrownewInvalidOperationException($[MqttTopic] 方法{type.Name}.{method.Name}返回值必须是 void 或 Task);}// 初始化或追加到列表if(!Routes.TryGetValue(attribute.Topic,outvarhandlerList)){handlerListnewList(Type,MethodInfo)();Routes[attribute.Topic]handlerList;}handlerList.Add((type,method));}}}}}路由分发publicrecordMqttMessageContext(stringtopic,stringpayload);/// summary/// 路由分发/// /summarypublicclassMqttMessageDispatcher{privatereadonlyMqttRouteRegistry_registry;privatereadonlyIServiceProvider_serviceProvider;publicMqttMessageDispatcher(MqttRouteRegistryregistry,IServiceProviderserviceProvider){_registryregistry;_serviceProviderserviceProvider;}publicasyncTaskDispatchMessageAsync(stringtopic,stringpayload){// 1. 如果没有任何类订阅这个 Topic直接退出if(!_registry.Routes.TryGetValue(topic,outvarhandlers)||handlers.Count0){return;}// 2. 创建一个顶层的作用域或者为每个订阅者创建独立作用域。// 这里推荐采用“一个 Topic 创建一个 Scope”如果追求极致隔离也可以在 foreach 内部单独 Scope。using(varscope_serviceProvider.CreateScope()){vartasksnewListTask();// 3. 遍历所有订阅了该 Topic 的处理器实现一对多广播foreach(varhandlerinhandlers){// 使用 Task.Run 进行并行多线程分发防止订阅者 A 耗时导致订阅者 B 延迟收到消息tasks.Add(Task.Run(async(){try{// 动态向 DI 容器请求实例例如 MainWindowViewModel、AlarmService 等varinstancescope.ServiceProvider.GetService(handler.ServiceType);if(instancenull)return;varcontextnewMqttMessageContext(topic,payload);// 执行方法if(handler.Method.ReturnTypetypeof(Task)){await(Task)handler.Method.Invoke(instance,newobject[]{context});}else{handler.Method.Invoke(instance,newobject[]{context});}}catch(Exceptionex){// 单个订阅者执行崩溃捕获它不影响其他类接收消息System.Diagnostics.Debug.WriteLine($[Dispatcher] 订阅者{handler.ServiceType.Name}处理失败:{ex.Message});}}));}// 等待当前 Topic 的所有订阅者全部处理完毕awaitTask.WhenAll(tasks);}}}依赖注入// 1. 初始化并注册 MQTT 路由注册表,所有消息处理的类必须注入varregistrynewMqttRouteRegistry();// 扫描当前程序集包含所有 ViewModel 和 Serviceregistry.ScanAssembly(Assembly.GetExecutingAssembly());services.AddSingleton(registry);services.AddSingletonMqttMessageDispatcher();//所有包含 [MqttTopic] 特性的类必须注册到容器中services.AddSingletonMainWindowViewModel();调用[MqttTopic(PLC01/DB7000.58.1)] private async Task UpdateMode(MqttMessageContext context) { Console.WriteLine($收到消息{context.payload}); }

相关新闻

Java开发环境搭建与配置实战指南

Java开发环境搭建与配置实战指南

1. Java开发环境搭建全攻略 第一次接触Java开发的朋友们,最头疼的莫过于环境搭建这个"入门仪式"。作为一个从2008年就开始用Java的老码农,我见过太多新手在环境配置上栽跟头。今天我就把十几年积累的环境搭建经验,用最直白的方式分…

2026/7/30 15:25:42 阅读更多 →
从零实现Python智能体:思维链、工具调用与记忆机制详解

从零实现Python智能体:思维链、工具调用与记忆机制详解

在AI技术快速发展的今天,Agent(智能体)已成为连接大语言模型与现实应用的重要桥梁。很多开发者一提到Agent开发就想到使用现成框架,但框架往往隐藏了底层原理,让初学者难以真正理解Agent的工作机制。本文将从零开始&am…

2026/7/30 15:25:42 阅读更多 →
Grok 4.5 vs Claude Opus vs GPT-4:大模型性能实测与选型指南

Grok 4.5 vs Claude Opus vs GPT-4:大模型性能实测与选型指南

1. 引言:大模型性能竞赛的新格局 近期AI大模型领域迎来重要更新,Grok 4.5的发布在开发者社区引发广泛讨论。作为xAI推出的最新版本,Grok 4.5在多项基准测试中表现亮眼,特别是在推理速度、成本控制和多模态能力方面实现显著突破。对…

2026/7/30 15:25:42 阅读更多 →

最新新闻

Vue 3 + Vuetify 3 + Vite 现代化管理后台架构解决方案

Vue 3 + Vuetify 3 + Vite 现代化管理后台架构解决方案

Vue 3 Vuetify 3 Vite 现代化管理后台架构解决方案 【免费下载链接】materio-vuetify-vuejs-admin-template-free Production Ready, Carefully Crafted, Extensive Vuetifty Free Admin Template 🤩 项目地址: https://gitcode.com/gh_mirrors/ma/materio-vuet…

2026/7/30 15:34:45 阅读更多 →
VS双击无法跳转到事件,怎么办哪?

VS双击无法跳转到事件,怎么办哪?

VS双击无法跳转到事件,怎么办哪? 最近新装的VS,打开工程,双击界面按钮,无法跳转到事件中,表现的现象就是双击后无反应。 第一步清理一下工程。 第二步删除xxx.sIn 从源码中XXX.vcproj 重新打开,另存为即可。…

2026/7/30 15:34:45 阅读更多 →
Maple Mono:终极编程字体选择指南

Maple Mono:终极编程字体选择指南

Maple Mono:终极编程字体选择指南 【免费下载链接】maple-font Maple Mono: Open source monospace font with round corner, ligatures and Nerd-Font icons for IDE and terminal, fine-grained customization options. 带连字和控制台图标的圆角等宽字体&#xf…

2026/7/30 15:34:45 阅读更多 →
浏览器音乐解锁工具:一键解密主流平台加密音乐文件

浏览器音乐解锁工具:一键解密主流平台加密音乐文件

浏览器音乐解锁工具:一键解密主流平台加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://…

2026/7/30 15:34:45 阅读更多 →
2026年维普AIGC检测达标指南:维普AI率超标4.8元一次解决完整方案

2026年维普AIGC检测达标指南:维普AI率超标4.8元一次解决完整方案

2026年维普AIGC检测达标指南:维普AI率超标4.8元一次解决完整方案 用嘎嘎降AI(www.aigcleaner.com)处理过维普AIGC检测达标,4.8元,一次达标。完整方案和注意事项都在下面。 平台特点分析 不同AIGC检测平台&#xff0c…

2026/7/30 15:34:45 阅读更多 →
单片机毕设选题推荐:基于单片机的阈值可调式智能雨刮控制系统设计 基于雨水传感器的多模式雨刮器智能控制系统实现(013401)

单片机毕设选题推荐:基于单片机的阈值可调式智能雨刮控制系统设计 基于雨水传感器的多模式雨刮器智能控制系统实现(013401)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/7/30 15:33:45 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻