Трансляция SignalR Hub из пользовательской функции, запускаемой методом Hub - PullRequest
1 голос
/ 17 июня 2019

Как я могу запустить 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.Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 19 июня 2019

Изучив приложение StockTicker, я смог решить свои проблемы, создав дополнительный класс, который обрабатывает длительный процесс (передача данных из IoT Hub всем подключенным клиентам). Если кто-то сталкивается с такой проблемой, я выложу отредактированный код. Спасибо @Глен Ферри

...