Диаграмма обновления SignalR не работает должным образом - PullRequest
1 голос
/ 06 мая 2020

Я использую Net Core api и angular, и у меня здесь одна панель инструментов. Есть несколько диаграмм. Я открываю эту страницу с двумя разными пользователями. И когда я что-то меняю в базе данных, из signalr api поступают как измененные, так и неизмененные данные, как показано ниже в console.log. В db я изменил 3 на 2 только последний второй элемент.

  home.component.ts:2153 -1,1,31.01.2020,-1,2,-1
2 home.component.ts:2153 -1,1,31.01.2020,-1,3,-1
2 home.component.ts:2153 -1,1,31.01.2020,-1,2,-1
  home.component.ts:2153 -1,1,31.01.2020,-1,3,-1
  home.component.ts:2153 -1,1,31.01.2020,-1,2,-1
2 home.component.ts:2153 -1,1,31.01.2020,-1,3,-1
  home.component.ts:2153 -1,1,31.01.2020,-1,2,-1

В основной части контроллера я называю это. Он вызывает один метод и возвращает данные

[HttpGet]
[Route("Charts")]
public IActionResult Charts(int refShare, int sicil)
{
    var timerManager = new TimerManeger(() => _hub.Clients.All.SendAsync(refShare.ToString(), new { type = "chart", data= _repo.SharingDashboard(refShare, sicil) }));
    return Ok(new { Message = "Charts Completed" });
}

In angular part

this._hub= new signalR.HubConnectionBuilder().withUrl(Url.url.signalR.getMessages, {
      skipNegotiation: true,
      transport: signalR.HttpTransportType.WebSockets
}).build();
this._hub.start().
    then(()=>console.log("Connection Started")).
    catch(err=>console.log(err));
this._hub.on(this.refShare.toString(),(data)=>{
    this.RealTimeDahboard(data.data)
});
this.startHttpRequest();

Когда я пишу console.log in RealTimeDahboard(), приходит функция, приведенная выше. Так что моя диаграмма всегда меняется. Это происходит, когда я открываю с двумя пользователями одновременно. Если я открываю одного пользователя, он работает нормально. В чем может быть причина?

Спасибо за помощь

1 Ответ

0 голосов
/ 06 мая 2020

Это доказуемо, потому что, когда ваш второй пользователь подключается к концентратору и вызывает ваш метод, он создает экземпляр new TimerManeger(), и поэтому у вас есть 2 экземпляра, вызывающих метод концентратора _hub.Clients.All.SendAsync().

Итак, если, например, у вас будет 10 пользователей, вы будете получать в 10 раз больше данных за каждый тик таймера.

То, что вы делаете здесь с signalr, не является правильным. Когда ваш клиент подключается к концентратору, он не должен запускать метод http. Я бы рекомендовал просто добавить ваших клиентов в группу диаграмм, а ваша служба таймера отправит обновленные данные диаграммы всем клиентам, подключенным к этой группе.

У меня есть проект GitHub, который также обновляет данные диаграммы sh в в реальном времени с помощью SignalR, и вы можете увидеть, как я подошел к вашей аналогичной проблеме. Вы можете посмотреть здесь .

У меня есть аналогичный проект с диаграммами на GitHub, и вы можете увидеть, как это делается.

...