修改退出时关闭所有服务和连接

This commit is contained in:
2025-09-06 19:59:21 +08:00
parent 6f0e80e1e2
commit be16e1a5d7
4 changed files with 73 additions and 6 deletions

View File

@@ -9,7 +9,7 @@ namespace DMS.Infrastructure.Interfaces.Services
/// <summary>
/// MQTT后台服务接口负责管理MQTT连接和数据传输
/// </summary>
public interface IMqttBackgroundService
public interface IMqttBackgroundService : IDisposable
{
/// <summary>
/// 启动MQTT后台服务

View File

@@ -9,7 +9,7 @@ namespace DMS.Infrastructure.Interfaces.Services
/// <summary>
/// MQTT服务管理器接口负责管理MQTT连接和变量监控
/// </summary>
public interface IMqttServiceManager
public interface IMqttServiceManager : IDisposable
{
/// <summary>
/// 初始化服务管理器

View File

@@ -243,5 +243,20 @@ namespace DMS.Infrastructure.Services
_logger.LogInformation("MQTT列表发生了变化正在重新加载数据...");
_reloadSemaphore.Release();
}
/// <summary>
/// 释放资源
/// </summary>
public override void Dispose()
{
_logger.LogInformation("正在释放MQTT后台服务资源...");
_dataCenterService.OnLoadDataCompleted -= OnLoadDataCompleted;
_reloadSemaphore?.Dispose();
base.Dispose();
_logger.LogInformation("MQTT后台服务资源已释放");
}
}
}

View File

@@ -39,6 +39,7 @@ public partial class App : System.Windows.Application
public IServiceProvider Services { get; }
public new static App Current => (App)System.Windows.Application.Current;
public IHost Host { get; }
private readonly ILogger<App> _logger;
public App()
{
@@ -53,6 +54,7 @@ public partial class App : System.Windows.Application
})
.Build();
Services = Host.Services;
_logger = Host.Services.GetRequiredService<ILogger<App>>();
}
protected override async void OnStartup(StartupEventArgs e)
@@ -86,10 +88,60 @@ public partial class App : System.Windows.Application
protected override async void OnExit(ExitEventArgs e)
{
// 停止服务
_logger.LogInformation("应用程序正在关闭,开始清理资源...");
try
{
// 获取服务管理器
var opcUaServiceManager = Host.Services.GetService<IOpcUaServiceManager>();
var s7ServiceManager = Host.Services.GetService<IS7ServiceManager>();
var mqttServiceManager = Host.Services.GetService<IMqttServiceManager>();
// 优雅地关闭OPC UA服务
if (opcUaServiceManager != null)
{
_logger.LogInformation("正在关闭OPC UA服务...");
opcUaServiceManager.Dispose();
_logger.LogInformation("OPC UA服务已关闭");
}
// 优雅地关闭S7服务
if (s7ServiceManager != null)
{
_logger.LogInformation("正在关闭S7服务...");
s7ServiceManager.Dispose();
_logger.LogInformation("S7服务已关闭");
}
// 优雅地关闭MQTT服务
if (mqttServiceManager != null)
{
_logger.LogInformation("正在关闭MQTT服务...");
mqttServiceManager.Dispose();
_logger.LogInformation("MQTT服务已关闭");
}
// 停止后台服务
_logger.LogInformation("正在停止后台服务...");
await Host.StopAsync();
_logger.LogInformation("后台服务已停止");
// 释放Host资源
_logger.LogInformation("正在释放Host资源...");
Host.Dispose();
_logger.LogInformation("Host资源已释放");
// 关闭NLog
_logger.LogInformation("正在关闭NLog...");
LogManager.Shutdown();
_logger.LogInformation("NLog已关闭");
}
catch (Exception ex)
{
_logger.LogError(ex, "关闭应用程序时发生错误: {ErrorMessage}", ex.Message);
}
_logger.LogInformation("应用程序已完全关闭");
base.OnExit(e);
}