Как я могу запустить SignalR Hub для длительного процесса в таком случае?Я хочу транслировать данные из асинхронного приемника IoT Hub всем клиентам, подключенным к концентратору, но я хочу, чтобы только 1 поток выполнялся и отправлял данные (IoT Hub ограничивает 5 слушателей).
Этот код работает и хорошо выполняет свою работу, за исключением периодических исключений «Концентратор утилизируется», когда пользователи подключаются и отключаются (ошибки возникают, когда номер клиента изменяется с 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.Есть ли лучший способ сделать это?