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");