fix: 修复数据库与SignalR无法连接的问题

This commit is contained in:
2025-08-15 13:02:56 +08:00
parent 6fa7fffa7f
commit a00cc84e48
20 changed files with 78 additions and 123 deletions

View File

@@ -16,6 +16,7 @@ public interface IDigitalTubesHub
Task<bool> StartScan();
Task<bool> StopScan();
Task<bool> SetFrequency(int frequency);
Task<DigitalTubeTaskStatus> GetStatus();
}
[Receiver]
@@ -24,7 +25,20 @@ public interface IDigitalTubesReceiver
Task OnReceive(byte[] data);
}
class DigitalTubeInfo
[TranspilationSource]
public class DigitalTubeTaskStatus
{
public int Frequency { get; set; } = 100;
public bool IsRunning { get; set; } = false;
public DigitalTubeTaskStatus(DigitalTubeInfo info)
{
Frequency = info.Frequency;
IsRunning = info.IsRunning;
}
}
public class DigitalTubeInfo
{
public string ClientID { get; set; }
public SevenDigitalTubesCtrl TubeClient { get; set; }
@@ -46,16 +60,13 @@ public class DigitalTubesHub : Hub<IDigitalTubesReceiver>, IDigitalTubesHub
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private readonly IHubContext<DigitalTubesHub, IDigitalTubesReceiver> _hubContext;
private readonly Database.UserManager _userManager;
private readonly Database.UserManager _userManager = new();
private ConcurrentDictionary<string, DigitalTubeInfo> _infoDict = new();
public DigitalTubesHub(
IHubContext<DigitalTubesHub, IDigitalTubesReceiver> hubContext,
Database.UserManager userManager)
public DigitalTubesHub(IHubContext<DigitalTubesHub, IDigitalTubesReceiver> hubContext)
{
_hubContext = hubContext;
_userManager = userManager;
}
private Optional<Database.Board> TryGetBoard()
@@ -172,8 +183,8 @@ public class DigitalTubesHub : Hub<IDigitalTubesReceiver>, IDigitalTubesHub
{
try
{
if (frequency < 1 || frequency > 1000)
throw new ArgumentException("Frequency must be between 1 and 1000");
if (frequency < 1 || frequency > 1000) return Task.FromException<bool>(
new ArgumentException("Frequency must be between 1 and 1000"));
var board = TryGetBoard().OrThrow(() => new Exception("Board not found"));
if (_infoDict.GetOrAdd(
@@ -194,4 +205,29 @@ public class DigitalTubesHub : Hub<IDigitalTubesReceiver>, IDigitalTubesHub
return Task.FromResult(false);
}
}
public Task<DigitalTubeTaskStatus> GetStatus()
{
try
{
var board = TryGetBoard().OrThrow(() => new Exception("Board not found"));
if (_infoDict.GetOrAdd(
board.ID.ToString(),
(_) => new DigitalTubeInfo(
Context.ConnectionId,
new SevenDigitalTubesCtrl(board.IpAddr, board.Port, 2))
) is DigitalTubeInfo info)
{
return Task.FromResult(new DigitalTubeTaskStatus(info));
}
return Task.FromException<DigitalTubeTaskStatus>(new ArgumentException("Wrong argument"));
}
catch (Exception ex)
{
logger.Error(ex, "Failed to get status");
return Task.FromException<DigitalTubeTaskStatus>(new Exception("Failed to get status"));
}
}
}