using Ayay.SerilogLogs; using Serilog; using System.Net; using System.Net.Sockets; namespace SHH.MjpegPlayer { /// /// Mjpeg 服务 /// public class MjpegServer { private static readonly ILogger _sysLog = Log.ForContext("SourceContext", LogModules.Core); // [修复] 静态列表管理监听器,支持优雅停止 private static readonly List _listeners = new List(); private static readonly object _lock = new object(); /// /// 启动服务 /// /// public static void Start(int port) { try { // 示例:在 MjpegServer 初始化循环中调用 TaskManager.Run($"MjpegServer-{port}", "Network", async (token) => { // [Modified]: 使用 TaskManager 托管,支持外部取消令牌 token try { var cfg = MjpegStatics.Cfg; IPAddress ipAddress = IPAddress.Any; if (!string.IsNullOrEmpty(cfg.SvrMjpegIp) && IPAddress.TryParse(cfg.SvrMjpegIp, out var parsedIp)) { ipAddress = parsedIp; } var server = new TcpListener(ipAddress, port); lock (_lock) _listeners.Add(server); server.Start(); // Logs.LogInformation... _sysLog.Information($"启动服务成功,端口:{port}"); try { // [Modified]: 检查取消令牌和全局运行状态 while (!token.IsCancellationRequested) { try { // 使用 AcceptTcpClientAsync 的重载或在外部检查 var client = await server.AcceptTcpClientAsync(); if (client == null) continue; var session = new MjpegSession(); session.Create(client); } catch (Exception ex) { // [修复] 异常防暴 await Task.Delay(1000, token); } } } finally { // [修复] 任务退出清理 try { server.Stop(); } catch { } lock (_lock) _listeners.Remove(server); } } catch (Exception ex) { // Logs.LogError... 捕获初始化异常 } }); } catch (Exception ex) { //Logs.LogError(ex.Message, ex.StackTrace); } } /// /// 停止所有服务 (新增) /// public static void StopAll() { lock (_lock) { foreach (var server in _listeners) { try { server.Stop(); } catch { } } _listeners.Clear(); } } } }