fix: 修复数据库与SignalR无法连接的问题
This commit is contained in:
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user