C# M2Mqtt组件连接失败后占用大量cpu不释放以及重复用一个client进行重连会出现假连接现象的解决方案

发布时间 2023-10-17 17:18:44作者: WmW

M2Mqtt是C#的一个mqtt客户端库,这个库很好用,但是它有严重的Bug

当我们调用Connect建立连接时,如果身份认证失败,它会返回状态码3,即"连接已拒绝,不合格的客户端标识符",但是其内部的异步线程并不会终止,依然会占用大量的cpu资源,即使Disconnect且把client置为null也没用,除非彻底关闭程序

当我们第一次调用Connect连接失败后,如果重复调用同一个client的Connect函数,在若干次后,它竟然神奇的连接成功了,此时的IsConnected=true,发布数据也不会报错,但是这都是假象,当你调用Disconnect时,它就会报错,说是无法调用已经释放的Socket

这些问题github上也有人遇见过了,他们在源码上做了很小的改动就能解决这个问题,但是貌似原作者已经不打算更新代码了,合并请求没有得到通过

https://github.com/eclipse/paho.mqtt.m2mqtt/pull/77/files

我对github不是太熟悉,只能自己摸索着把原项目下到本地,然后按照上面进行代码改动,然后重新发布出了dll

经过测试,改过的dll确实没有再出现上面的问题了

最开始我是直接打开原项目根目录下的sln,结果一堆报错,

在源码的M2Mqtt目录下有很多的项目,因为之前我在nuget上用的就是这个M2Mqtt.Net.dll,所以我就打开了M2Mqtt.Net.csproj,这个可以正常加载项目,然后就可以在里面进行修改了,最后生成dll就能用了