SignalR Hub broadcasting from custom function triggered by Hub method

Viewed 256

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?

1 Answers

After looking into a StockTicker application I was able to solve my problems by creating additional class which handles long running process (broadcasting data from IoT Hub to all connected clients). If anyone encounters issue like this i will post edited code. Thanks @Glen Ferrie

Related