【发布时间】:2019-06-19 14:40:33
【问题描述】:
在这种情况下,如何运行 SignalR Hub 以实现长时间运行的进程?我想将数据从异步 IoT 中心接收器广播到连接到集线器的所有客户端,但我只想让 1 个线程运行并发送数据(物联网中心限制 5 个侦听器)。
除了在用户连接和断开连接时偶尔出现“Hub 已处理”异常(客户端编号从 1 更改为 0 或 0 更改为 1 - 即线程启动和停止时会发生错误)之外,此代码可以正常工作并且做得很好)
public override Task OnDisconnectedAsync(Exception exception)
{
if (UserHandler.ConnectedIds.Count)
{
UserHandler.Remove(Context.ConnectionId);
numberOfUsers = UserHandler.ConnectedIds.Count;
}
else
{
UserHandler.Remove(Context.ConnectionId);
}
return base.OnDisconnectedAsync(exception);
}
public override Task OnConnectedAsync()
{
UserHandler.ConnectedIds.Add(UserHandler.Create(Context.ConnectionId, "connectionString"));
System.Diagnostics.Trace.WriteLine("User connected!");
return base.OnConnectedAsync();
}
public void Send()
{
if (UserHandler.ConnectedIds.Count==1)
{
thread = new Thread(() => SendMessage());
thread.Start();
}
}
public void SendMessage()
{
while (UserHandler.ConnectedIds.Count > 0)
{
Task<string> getData = recieveFromDevice.ReceiveMessagesFromDeviceAsync(eventHubReceiver, "3");
var receivedList = JsonConvert.DeserializeObject<List<Variable>>(getData.Result);
if (UserHandler.ConnectedIds.Count != 0)
{
Clients.All.SendAsync("Send", receivedList);
}
}
}
}
我已阅读有关使用 Hub 上下文的文档,但是当我从 Hub 方法启动线程时,我不确定如何在此处执行此操作。有没有更好的方法来做到这一点?
【问题讨论】:
-
这是一个很好的教程,可以帮助您构建可扩展的 SignalR 应用程序 - docs.microsoft.com/en-us/aspnet/signalr/overview/…
标签: c# multithreading asp.net-core signalr signalr-hub