using System.Collections.ObjectModel; using System.Windows; // 如果是 WPF using SHH.Contracts; namespace SHH.CameraDashboard { /// /// 服务端状态管理器 /// 职责:维护在线设备列表,供 UI 绑定 /// public class ServerStateManager { // UI 绑定的集合 public ObservableCollection OnlineServers { get; } = new ObservableCollection(); /// /// 处理注册/心跳包,更新列表 /// public void RegisterOrUpdate(ServerRegistrationDto info) { // 确保在 UI 线程执行 (WPF 必须) Application.Current.Dispatcher.Invoke(() => { var existing = OnlineServers.FirstOrDefault(x => x.InstanceId == info.InstanceId); if (existing != null) { // 更新已有节点状态 existing.IpAddress = info.ServerIp; existing.WebApiPort = info.WebApiPort; existing.LastHeartbeat = DateTime.Now; existing.Status = "在线"; // 触发属性变更通知... } else { // 新增节点 OnlineServers.Add(new ServerNodeInfo { InstanceId = info.InstanceId, IpAddress = info.ServerIp, WebApiPort = info.WebApiPort, ProcessId = info.ProcessId, LastHeartbeat = DateTime.Now, Status = "在线" }); } }); } } /// /// UI 显示用的模型 /// public class ServerNodeInfo { public string InstanceId { get; set; } public string IpAddress { get; set; } public int WebApiPort { get; set; } public int ProcessId { get; set; } public string Status { get; set; } public DateTime LastHeartbeat { get; set; } // 方便 UI 显示的字符串 public string DisplayName => $"{InstanceId} ({IpAddress}:{WebApiPort})"; } }