How can I run SignalR Hub for long running process in case like this? I want to broadcast data from async IoT Hub receiver to all clients connected to hub, but i want to have only 1 thread running and sending data (IoT Hub limits 5 listeners).
This code works and does the job well, apart from getting occasional "Hub is disposed" exceptions when users connect and disconnect (errors occur when client number changes from 1 to 0 or 0 to 1 - that is when thread starts and stops)
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);
}
}
}
}
I have read documentation about using Hub context but I'm not sure how to do it here, when I'm starting a thread from a Hub method. Is there a better way to do this?