From 62c16c016d0536fe5bd7775ab2a2e11b92ba0470 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Wed, 20 Aug 2025 16:02:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=A4=BA=E6=B3=A2=E5=99=A8=E6=97=A0=E6=B3=95=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/Hubs/OscilloscopeHub.cs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/server/src/Hubs/OscilloscopeHub.cs b/server/src/Hubs/OscilloscopeHub.cs index 219cfef..66c3a94 100644 --- a/server/src/Hubs/OscilloscopeHub.cs +++ b/server/src/Hubs/OscilloscopeHub.cs @@ -69,9 +69,8 @@ class OscilloscopeScanTaskInfo { public Task? ScanTask { get; set; } public OscilloscopeCtrl Client { get; set; } - public CancellationTokenSource CTS { get; set; } = new(); + public CancellationTokenSource CTS { get; set; } = new CancellationTokenSource(); public int Frequency { get; set; } = 100; - public bool IsRunning { get; set; } = false; public OscilloscopeScanTaskInfo(OscilloscopeCtrl client) { @@ -148,8 +147,9 @@ public class OscilloscopeHub : Hub, IOscilloscopeHub } } - private Task ScanTask(OscilloscopeScanTaskInfo taskInfo, CancellationToken token) + private Task ScanTask(OscilloscopeScanTaskInfo taskInfo, string clientId) { + var token = taskInfo.CTS.Token; return Task.Run(async () => { while (!token.IsCancellationRequested) @@ -161,10 +161,14 @@ public class OscilloscopeHub : Hub, IOscilloscopeHub continue; } - await _hubContext.Clients.Client(Context.ConnectionId).OnDataReceived(data); + await _hubContext.Clients.Client(clientId).OnDataReceived(data); await Task.Delay(1000 / taskInfo.Frequency, token); } - }, token); + }, token).ContinueWith(t => + { + if (t.IsFaulted) + logger.Error(t.Exception, "ScanTask failed"); + }); } public async Task StartCapture() @@ -175,7 +179,7 @@ public class OscilloscopeHub : Hub, IOscilloscopeHub var key = (board.ID.ToString(), Context.ConnectionId); var client = GetOscilloscope().OrThrow(() => new Exception("Oscilloscope not found")); - if (_scanTasks.TryGetValue(key, out var existing) && existing.IsRunning) + if (_scanTasks.TryGetValue(key, out var existing)) return true; var result = await client.SetCaptureEnable(true); @@ -186,8 +190,7 @@ public class OscilloscopeHub : Hub, IOscilloscopeHub } var scanTaskInfo = new OscilloscopeScanTaskInfo(client); - var token = scanTaskInfo.CTS.Token; - scanTaskInfo.ScanTask = ScanTask(scanTaskInfo, token); + scanTaskInfo.ScanTask = ScanTask(scanTaskInfo, Context.ConnectionId); _scanTasks[key] = scanTaskInfo; @@ -211,7 +214,6 @@ public class OscilloscopeHub : Hub, IOscilloscopeHub if (_scanTasks.TryRemove(key, out var scanInfo)) { - scanInfo.IsRunning = false; scanInfo.CTS.Cancel(); if (scanInfo.ScanTask != null) await scanInfo.ScanTask; scanInfo.CTS.Dispose(); @@ -384,7 +386,7 @@ public class OscilloscopeHub : Hub, IOscilloscopeHub var board = TryGetBoard().OrThrow(() => new Exception("Board not found")); var key = (board.ID.ToString(), Context.ConnectionId); - if (_scanTasks.TryGetValue(key, out var scanInfo) && scanInfo.IsRunning) + if (_scanTasks.TryGetValue(key, out var scanInfo)) { scanInfo.Frequency = frequency; return true;