fix: 尝试修复示波器无法关闭的问题
This commit is contained in:
parent
f23a8a9712
commit
62c16c016d
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue