C# MQTT消息发布场景下每秒打印消息数量的实现咨询
实现MQTT每秒发布消息数统计的方案
修改后的可运行代码如下:
static async Task SimulatePublish() // 调整为异步方法适配MQTT异步发布接口 { int perSecondCounter = 0; DateTime lastPrintTime = DateTime.UtcNow; while (true) { var testMessage = new MqttApplicationMessageBuilder() .WithTopic("MqttData") .WithPayload($"Payload: This is my Code") .WithAtMostOnceQoS() .WithRetainFlag() .Build(); if (_client.IsConnected) { // 仅实际触发发布操作时累加计数 perSecondCounter++; // 加await可避免fire-and-forget导致的资源积压,不需要等待发布结果可直接删除该行await await _client.PublishAsync(testMessage); } // 检查是否到达1秒统计周期 if (DateTime.UtcNow - lastPrintTime >= TimeSpan.FromSeconds(1)) { Console.WriteLine($"最近1秒发布消息数:{perSecondCounter}"); // 重置计数器和统计时间标记 perSecondCounter = 0; lastPrintTime = DateTime.UtcNow; } } }
关键调整说明
- 移除原代码中无意义的全局counter变量,替换为和统计周期绑定的秒级计数器
- 新增统计时间标记变量,每次跨秒时自动输出上一秒的统计结果并重置计数
- 计数逻辑仅在MQTT客户端连接成功、实际执行发布操作时触发,统计结果准确
- 适配异步发布方法的规范写法,避免无等待调用异步接口导致的内存泄漏问题
可选优化项
如果需要统计实际发布成功的消息数,而非调用发布接口的次数,可以在await _client.PublishAsync(testMessage)拿到返回结果后,判断发布状态为成功再累加计数器即可。
内容的提问来源于stack exchange,提问作者Nit_16
相关产品推荐
相关产品推荐

