From af218bd8c543aadfb8a389e350d2b57608d56f99 Mon Sep 17 00:00:00 2001 From: Amadeo Alex <68441479+amadeo-alex@users.noreply.github.com> Date: Sat, 12 Oct 2024 21:38:27 +0200 Subject: [PATCH] attempt to prevent disposed exception on mqtt client --- .../Functions/HelperFunctions.cs | 2 +- .../HASS.Agent.Satellite.Service/MQTT/MqttManager.cs | 4 ++-- src/HASS.Agent/HASS.Agent.Shared/Mqtt/IMqttManager.cs | 2 +- src/HASS.Agent/HASS.Agent/Forms/Configuration.cs | 2 +- src/HASS.Agent/HASS.Agent/Functions/HelperFunctions.cs | 2 +- src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs | 9 ++++++--- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/HASS.Agent/HASS.Agent.Satellite.Service/Functions/HelperFunctions.cs b/src/HASS.Agent/HASS.Agent.Satellite.Service/Functions/HelperFunctions.cs index c969eecb..4dc66e2d 100644 --- a/src/HASS.Agent/HASS.Agent.Satellite.Service/Functions/HelperFunctions.cs +++ b/src/HASS.Agent/HASS.Agent.Satellite.Service/Functions/HelperFunctions.cs @@ -61,7 +61,7 @@ internal static async Task ShutdownAsync(TimeSpan waitBeforeClosing) // stop mqtt await Variables.MqttManager.AnnounceAvailabilityAsync(true); - Variables.MqttManager.Disconnect(); + await Variables.MqttManager.DisconnectAsync(); // stop rpc Variables.RpcServer?.Dispose(); diff --git a/src/HASS.Agent/HASS.Agent.Satellite.Service/MQTT/MqttManager.cs b/src/HASS.Agent/HASS.Agent.Satellite.Service/MQTT/MqttManager.cs index 6758dd7f..f35a8465 100644 --- a/src/HASS.Agent/HASS.Agent.Satellite.Service/MQTT/MqttManager.cs +++ b/src/HASS.Agent/HASS.Agent.Satellite.Service/MQTT/MqttManager.cs @@ -520,14 +520,14 @@ public async Task ClearDeviceConfigAsync() /// /// Disconnect from the broker (if connected) /// - public void Disconnect() + public async Task DisconnectAsync() { if (_mqttClient == null) return; if (IsConnected()) { - _mqttClient.InternalClient.DisconnectAsync(); + await _mqttClient.StopAsync(); _mqttClient.Dispose(); } diff --git a/src/HASS.Agent/HASS.Agent.Shared/Mqtt/IMqttManager.cs b/src/HASS.Agent/HASS.Agent.Shared/Mqtt/IMqttManager.cs index d41673e7..84966e21 100644 --- a/src/HASS.Agent/HASS.Agent.Shared/Mqtt/IMqttManager.cs +++ b/src/HASS.Agent/HASS.Agent.Shared/Mqtt/IMqttManager.cs @@ -21,7 +21,7 @@ public interface IMqttManager MqttStatus GetStatus(); Task AnnounceAvailabilityAsync(bool offline = false); Task ClearDeviceConfigAsync(); - void Disconnect(); + Task DisconnectAsync(); Task SubscribeAsync(AbstractCommand command); Task UnsubscribeAsync(AbstractCommand command); diff --git a/src/HASS.Agent/HASS.Agent/Forms/Configuration.cs b/src/HASS.Agent/HASS.Agent/Forms/Configuration.cs index 2f83e22a..f3004050 100644 --- a/src/HASS.Agent/HASS.Agent/Forms/Configuration.cs +++ b/src/HASS.Agent/HASS.Agent/Forms/Configuration.cs @@ -182,7 +182,7 @@ private async void ProcessChanges() await Task.Delay(250); // disconnect mqtt so we don't get announced again - await Task.Run(Variables.MqttManager.Disconnect); + await Variables.MqttManager.DisconnectAsync(); forceRestart = true; } diff --git a/src/HASS.Agent/HASS.Agent/Functions/HelperFunctions.cs b/src/HASS.Agent/HASS.Agent/Functions/HelperFunctions.cs index b56eace8..0792e505 100644 --- a/src/HASS.Agent/HASS.Agent/Functions/HelperFunctions.cs +++ b/src/HASS.Agent/HASS.Agent/Functions/HelperFunctions.cs @@ -165,7 +165,7 @@ internal static async Task ShutdownAsync(TimeSpan waitBeforeClosing) { // stop mqtt await Variables.MqttManager.AnnounceAvailabilityAsync(true); - Variables.MqttManager.Disconnect(); + await Variables.MqttManager.DisconnectAsync(); // remove tray icon Variables.MainForm?.HideTrayIcon(); diff --git a/src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs b/src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs index 21426e50..5742c773 100644 --- a/src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs +++ b/src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs @@ -611,15 +611,18 @@ public async Task ClearDeviceConfigAsync() /// /// Disconnect from the broker (if connected) /// - public void Disconnect() + public async Task DisconnectAsync() { if (!Variables.AppSettings.MqttEnabled) return; + if (_mqttClient == null) + return; + if (IsConnected()) { - _mqttClient?.InternalClient?.DisconnectAsync(); - _mqttClient?.Dispose(); + await _mqttClient.StopAsync(); + _mqttClient.Dispose(); } Log.Information("[MQTT] Disconnected");