using DeviceService.Device; using DeviceService.Entity; using DeviceService.Logging; using DeviceService.Service.NamePipe; using System.Windows; namespace DeviceService.Service { public enum ServiceStatus { Idle = 0, Running = 1, Error = 2, } public class ServiceStateMachine : NotifyBase { public static ServiceStateMachine GlobalState = new ServiceStateMachine(); private ServiceStateMachine() { } private ServiceStatus _state; public ServiceStatus State { get => _state; set { SetProperty(ref _state, value); } } private bool _isRunning; public bool IsRunning { get => _isRunning; set { SetProperty(ref _isRunning, value); } } } public class ServiceManager { private static IService _serviceImpl; private const string PipeName = "DeviceService"; public static void Start() { if (ServiceStateMachine.GlobalState.State == ServiceStatus.Running) { MessageBox.Show("已启动"); return; } _serviceImpl = new NamePipeService(PipeName); _serviceImpl.DataReceived += PipeService_DataReceived; _serviceImpl.ClientConnected += PipeService_ClientConnected; _serviceImpl.ClientDisConnected += PipeService_ClientDisConnected; string err = string.Empty; bool allDone = true; foreach (var device in DeviceHelper.AllDevices) { if (!DeviceManager.Register(device, out string fail)) { allDone = false; err += $"{fail}\r\n"; } } if (!allDone && MessageBox.Show(err, "提示", MessageBoxButton.OKCancel) == MessageBoxResult.Cancel) { DeviceManager.UnRegisterAll(); ServiceStateMachine.GlobalState.State = ServiceStatus.Error; return; } if (!_serviceImpl.Start(out string msg)) { GlobalLogger.Logger.Error("ServiceManager", $"[服务] 管道服务启动失败:{msg}"); Stop(); // Stop 会把状态置为 Idle,这里再标记为异常,供界面显示 ServiceStateMachine.GlobalState.State = ServiceStatus.Error; throw new Exception(msg); } ServiceStateMachine.GlobalState.State = ServiceStatus.Running; } public static void Stop() { if (_serviceImpl == null) { return; } _serviceImpl.DataReceived -= PipeService_DataReceived; _serviceImpl.ClientConnected -= PipeService_ClientConnected; _serviceImpl.ClientDisConnected -= PipeService_ClientDisConnected; _serviceImpl.Stop(out _); _serviceImpl.Dispose(); _serviceImpl = null; ServiceStateMachine.GlobalState.State = ServiceStatus.Idle; } private static void PipeService_DataReceived(object? sender, RequestArg e) { // 数据到达事件来自后台线程,需要切换到 UI 线程显示 DeviceManager.HandleClientMessage(e); } private static void PipeService_ClientConnected(object? sender, IClient client) { // 连接/断开事件来自后台线程,列表更新需切换到 UI 线程 } private static void PipeService_ClientDisConnected(object? sender, IClient client) { } } }