У меня есть требование показать данные о живых запасах и в то же время уведомление на той же странице. Я использовал угловой 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, и я не уверен, что еще я могу сделать, если я хочу получать оба данных непрерывно.
В настоящее время вы используете веб-клиентов для запуска нажатия, а затем кражи потока запросов каждый раз, когда запрос выполняется, и блокирования его спящим. Не крадите потоки SignalR, скорее создайте свой собственный поток или используйте тот, который уже запущен и есть для вас.
В этом случае ваш стример акций должен иметь собственный поток, который поднимает события обновления акций. Если это так, позвоните в StockFeedHub и отправьте обновления своих акций всем клиентам, когда вы получите новое обновление акций.
void HandleNewStockMessage(StockModel stock){
GlobalHost
.ConnectionManager
.GetHubContext<StockFeedHub>()
.Clients.All.sendStocksData(stock);
}
Дополнительная информация о вызывающих концентраторах Signalr.
Я не уверен, как вы используете Redis. Думаю, вы используете его для своей объединительной платы. Если это так, проверьте масштаб с документом redis. Вам нужно только отправлять ваши уведомления (аналогичные вашим данным запаса), когда вы их получите, и ваша объединительная плата будет масштабировать сообщения.