优化了代码

This commit is contained in:
2025-07-15 18:28:17 +08:00
parent cd4b249bf9
commit 656bb924bc
2 changed files with 167 additions and 131 deletions

View File

@@ -1,18 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using System.Text;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Client.Options;
using PMSWPF.Models;
using PMSWPF.Services;
using PMSWPF.Helper;
using PMSWPF.Enums;
using PMSWPF.Models;
namespace PMSWPF.Services
{
@@ -69,7 +62,7 @@ namespace PMSWPF.Services
_serviceMainThread.Start();
}
private void Execute()
private async void Execute()
{
while (!_stopEvent.WaitOne(0))
{
@@ -81,11 +74,23 @@ namespace PMSWPF.Services
_reloadEvent.WaitOne();
// 初始加载MQTT配置和变量数据。
LoadMqttConfigurations();
ConnectMqttList();
_reloadEvent.Reset();
try
{
// 初始加载MQTT配置和变量数据。
var isLoaded = LoadMqttConfigurations();
if (isLoaded)
{
await ConnectMqttList();
}
}
catch (Exception e)
{
NotificationHelper.ShowError($"Mqt后台服务主程序在加载变量和连接服务器过程中出现了错误{e.Message} ", e);
}
finally
{
_reloadEvent.Reset();
}
}
}
@@ -93,7 +98,7 @@ namespace PMSWPF.Services
/// <summary>
/// 停止MQTT后台服务。
/// </summary>
public void StopService()
public async Task StopService()
{
NlogHelper.Info("Mqtt后台服务开始停止...."); // 记录服务停止信息
@@ -101,7 +106,7 @@ namespace PMSWPF.Services
// 取消订阅事件。
_dataServices.OnMqttListChanged -= HandleMqttListChanged;
DisconnecetAll();
await DisconnecetAll();
// 清空所有字典。
_mqttClients.Clear();
@@ -110,19 +115,24 @@ namespace PMSWPF.Services
NlogHelper.Info("Mqtt后台服务已停止。"); // 记录服务停止信息
}
private void DisconnecetAll()
private async Task DisconnecetAll()
{
// 断开所有已连接的MQTT客户端。
foreach (var mqttId in _mqttClients.Keys.ToList())
{
var client = _mqttClients[mqttId];
var mqtt = _mqttConfigDic[mqttId];
mqtt.IsConnected = false;
if (client.IsConnected)
try
{
client.DisconnectAsync()
.GetAwaiter()
.GetResult();
var client = _mqttClients[mqttId];
var mqtt = _mqttConfigDic[mqttId];
mqtt.IsConnected = false;
if (client.IsConnected)
{
await client.DisconnectAsync();
}
}
catch (Exception e)
{
NlogHelper.Error($"MqttID:{mqttId},断开连接的过程中发生了错误:{e.Message}",e);
}
}
}
@@ -132,21 +142,30 @@ namespace PMSWPF.Services
/// 加载并连接MQTT配置。
/// </summary>
/// <returns>表示异步操作的任务。</returns>
private void LoadMqttConfigurations()
private bool LoadMqttConfigurations()
{
NlogHelper.Info("开始加载Mqtt配置文件...");
_mqttConfigDic.Clear();
// 从数据服务获取所有MQTT配置。
var _mqttConfigList = _dataServices.Mqtts.Where(m => m.IsActive)
.ToList();
foreach (var mqtt in _mqttConfigList)
try
{
mqtt.OnMqttIsActiveChanged += OnMqttIsActiveChangedHandler;
_mqttConfigDic[mqtt.Id] = mqtt;
mqtt.ConnectMessage = "配置加载成功.";
}
NlogHelper.Info("开始加载Mqtt配置文件...");
_mqttConfigDic.Clear();
// 从数据服务获取所有MQTT配置。
var _mqttConfigList = _dataServices.Mqtts.Where(m => m.IsActive)
.ToList();
foreach (var mqtt in _mqttConfigList)
{
mqtt.OnMqttIsActiveChanged += OnMqttIsActiveChangedHandler;
_mqttConfigDic[mqtt.Id] = mqtt;
mqtt.ConnectMessage = "配置加载成功.";
}
NlogHelper.Info($"Mqtt配置文件加载成功开启的Mqtt客户端{_mqttConfigList.Count}个。");
NlogHelper.Info($"Mqtt配置文件加载成功开启的Mqtt客户端{_mqttConfigList.Count}个。");
return true;
}
catch (Exception e)
{
NotificationHelper.ShowError($"Mqtt后台服务在加载变量的过程中发生了错误:{e.Message}");
return false;
}
}
private async void OnMqttIsActiveChangedHandler(Mqtt mqtt)
@@ -159,7 +178,7 @@ namespace PMSWPF.Services
}
else
{
if (!_mqttClients.TryGetValue(mqtt.Id,out var client))
if (!_mqttClients.TryGetValue(mqtt.Id, out var client))
{
NlogHelper.Warn($"没有在Mqtt连接字典中找到名字为{mqtt.Name}的连接。");
return;
@@ -167,7 +186,7 @@ namespace PMSWPF.Services
if (client.IsConnected)
{
await client.DisconnectAsync();
await client.DisconnectAsync();
}
mqtt.IsConnected = false;
@@ -175,14 +194,12 @@ namespace PMSWPF.Services
_mqttClients.Remove(mqtt.Id);
NlogHelper.Info($"{mqtt.Name}的客户端,与服务器断开连接.");
}
}
catch (Exception e)
{
NotificationHelper.ShowError($"{mqtt.Name}客户端,开启或关闭的过程中发生了错误:{e.Message}",e);
NotificationHelper.ShowError($"{mqtt.Name}客户端,开启或关闭的过程中发生了错误:{e.Message}", e);
}
}
/// <summary>
@@ -204,7 +221,7 @@ namespace PMSWPF.Services
continue;
}
await ConnectMqtt(mqtt);
await ConnectMqtt(mqtt);
}
catch (Exception ex)
{
@@ -235,11 +252,11 @@ namespace PMSWPF.Services
client.UseApplicationMessageReceivedHandler(e => { HandleMessageReceived(e, mqtt); });
// 设置断开连接事件处理程序。
client.UseDisconnectedHandler(async (e) => await HandleDisconnected(e,options, client, mqtt));
client.UseDisconnectedHandler(async (e) => await HandleDisconnected(e, options, client, mqtt));
// 尝试连接到MQTT代理。
await client.ConnectAsync(options, CancellationToken.None);
await client.ConnectAsync(options, CancellationToken.None);
// 将连接成功的客户端添加到字典。
_mqttClients[mqtt.Id] = client;
}
@@ -247,7 +264,7 @@ namespace PMSWPF.Services
private static void HandleMessageReceived(MqttApplicationMessageReceivedEventArgs e, Mqtt mqtt)
{
var topic = e.ApplicationMessage.Topic;
var payload = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
var payload = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
NlogHelper.Info($"MQTT客户端 {mqtt.Name} 收到消息: 主题={topic}, 消息={payload}");
// 在这里添加处理消息的逻辑