fix: 尝试修复示波器无法关闭的问题
This commit is contained in:
		@@ -69,9 +69,8 @@ class OscilloscopeScanTaskInfo
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    public Task? ScanTask { get; set; }
 | 
					    public Task? ScanTask { get; set; }
 | 
				
			||||||
    public OscilloscopeCtrl Client { 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 int Frequency { get; set; } = 100;
 | 
				
			||||||
    public bool IsRunning { get; set; } = false;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OscilloscopeScanTaskInfo(OscilloscopeCtrl client)
 | 
					    public OscilloscopeScanTaskInfo(OscilloscopeCtrl client)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -148,8 +147,9 @@ public class OscilloscopeHub : Hub<IOscilloscopeReceiver>, IOscilloscopeHub
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private Task ScanTask(OscilloscopeScanTaskInfo taskInfo, CancellationToken token)
 | 
					    private Task ScanTask(OscilloscopeScanTaskInfo taskInfo, string clientId)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        var token = taskInfo.CTS.Token;
 | 
				
			||||||
        return Task.Run(async () =>
 | 
					        return Task.Run(async () =>
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            while (!token.IsCancellationRequested)
 | 
					            while (!token.IsCancellationRequested)
 | 
				
			||||||
@@ -161,10 +161,14 @@ public class OscilloscopeHub : Hub<IOscilloscopeReceiver>, IOscilloscopeHub
 | 
				
			|||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                await _hubContext.Clients.Client(Context.ConnectionId).OnDataReceived(data);
 | 
					                await _hubContext.Clients.Client(clientId).OnDataReceived(data);
 | 
				
			||||||
                await Task.Delay(1000 / taskInfo.Frequency, token);
 | 
					                await Task.Delay(1000 / taskInfo.Frequency, token);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }, token);
 | 
					        }, token).ContinueWith(t =>
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (t.IsFaulted)
 | 
				
			||||||
 | 
					                logger.Error(t.Exception, "ScanTask failed");
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public async Task<bool> StartCapture()
 | 
					    public async Task<bool> StartCapture()
 | 
				
			||||||
@@ -175,7 +179,7 @@ public class OscilloscopeHub : Hub<IOscilloscopeReceiver>, IOscilloscopeHub
 | 
				
			|||||||
            var key = (board.ID.ToString(), Context.ConnectionId);
 | 
					            var key = (board.ID.ToString(), Context.ConnectionId);
 | 
				
			||||||
            var client = GetOscilloscope().OrThrow(() => new Exception("Oscilloscope not found"));
 | 
					            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;
 | 
					                return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var result = await client.SetCaptureEnable(true);
 | 
					            var result = await client.SetCaptureEnable(true);
 | 
				
			||||||
@@ -186,8 +190,7 @@ public class OscilloscopeHub : Hub<IOscilloscopeReceiver>, IOscilloscopeHub
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var scanTaskInfo = new OscilloscopeScanTaskInfo(client);
 | 
					            var scanTaskInfo = new OscilloscopeScanTaskInfo(client);
 | 
				
			||||||
            var token = scanTaskInfo.CTS.Token;
 | 
					            scanTaskInfo.ScanTask = ScanTask(scanTaskInfo, Context.ConnectionId);
 | 
				
			||||||
            scanTaskInfo.ScanTask = ScanTask(scanTaskInfo, token);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _scanTasks[key] = scanTaskInfo;
 | 
					            _scanTasks[key] = scanTaskInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -211,7 +214,6 @@ public class OscilloscopeHub : Hub<IOscilloscopeReceiver>, IOscilloscopeHub
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            if (_scanTasks.TryRemove(key, out var scanInfo))
 | 
					            if (_scanTasks.TryRemove(key, out var scanInfo))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                scanInfo.IsRunning = false;
 | 
					 | 
				
			||||||
                scanInfo.CTS.Cancel();
 | 
					                scanInfo.CTS.Cancel();
 | 
				
			||||||
                if (scanInfo.ScanTask != null) await scanInfo.ScanTask;
 | 
					                if (scanInfo.ScanTask != null) await scanInfo.ScanTask;
 | 
				
			||||||
                scanInfo.CTS.Dispose();
 | 
					                scanInfo.CTS.Dispose();
 | 
				
			||||||
@@ -384,7 +386,7 @@ public class OscilloscopeHub : Hub<IOscilloscopeReceiver>, IOscilloscopeHub
 | 
				
			|||||||
            var board = TryGetBoard().OrThrow(() => new Exception("Board not found"));
 | 
					            var board = TryGetBoard().OrThrow(() => new Exception("Board not found"));
 | 
				
			||||||
            var key = (board.ID.ToString(), Context.ConnectionId);
 | 
					            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;
 | 
					                scanInfo.Frequency = frequency;
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user