Как написать два хаба, в котором запущен метод server в цикле while, и отправить данные клиенту SignalR

0

У меня есть требование показать данные о живых запасах и в то же время уведомление на той же странице. Я использовал угловой js, dot net signalR и поставил два цикла while, которые будут слушать стример и передавать данные клиенту, но не дают ожидаемого результата.

//Первый клиент

var stockFeedHub = $.connection.stockFeedHub;
    $.connection.hub.start();
    $.connection.hub.logging = true;
    $.connection.hub.start().done(function () {
        stockFeedHub.server.send("-1");
    })
    .fail(function () { console.log('Could not connect stockFeedHub'); });

    stockFeedHub.client.sendStocksData = function (data) {
}

//Второй клиент

var notificationFeedHub = $.connection.notificationFeedHub;
    $.connection.hub.start().done(function () {
        notificationFeedHub.server.getNotification();
    })
    .fail(function () { console.log("fail"); });

    notificationFeedHub.client.sendNotification = function (data) {
//some logic
    }

//Hub one-

 public class NotificationFeedHub : Hub
    {
        public void GetNotification()
        {
                while (true)
                {
                    //NotificationMessage I am getting from Redis.
                    //Call Client method to send notification.

                    Clients.All.sendNotification(notificationMessage));
                    Thread.Sleep(1000*5);
                }
        }

    }

//Класс второго концентратора

public class StockFeedHub: Hub
        {
            public void Send()
            {
                    while (true)
                    {
                        //I am getting stockLiveData from streamer server.
                        //Call Client method to send sendStocksData.

                        Clients.All.sendStocksData(stockLiveData));
                        Thread.Sleep(1000*5);
                    }
            }

        }

Я столкнулся с проблемой из-за цикла while, и я не уверен, что еще я могу сделать, если я хочу получать оба данных непрерывно.

  • 0
    Итак, каков ваш ожидаемый результат и что ваша ошибка или не работает?
  • 0
    Удалите цикл while в обоих методах.
Показать ещё 3 комментария
Теги:
websocket
signalr

1 ответ

1

В настоящее время вы используете веб-клиентов для запуска нажатия, а затем кражи потока запросов каждый раз, когда запрос выполняется, и блокирования его спящим. Не крадите потоки SignalR, скорее создайте свой собственный поток или используйте тот, который уже запущен и есть для вас.

В этом случае ваш стример акций должен иметь собственный поток, который поднимает события обновления акций. Если это так, позвоните в StockFeedHub и отправьте обновления своих акций всем клиентам, когда вы получите новое обновление акций.

void HandleNewStockMessage(StockModel stock){
  GlobalHost
    .ConnectionManager
    .GetHubContext<StockFeedHub>()
    .Clients.All.sendStocksData(stock);
}

Дополнительная информация о вызывающих концентраторах Signalr.

Я не уверен, как вы используете Redis. Думаю, вы используете его для своей объединительной платы. Если это так, проверьте масштаб с документом redis. Вам нужно только отправлять ваши уведомления (аналогичные вашим данным запаса), когда вы их получите, и ваша объединительная плата будет масштабировать сообщения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню