You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:48:03