我使用的是Net Core api和angular,我有一个dashboard,这里有一些图表。我用两个不同的用户打开这个页面。当我在数据库中改变一些东西的时候,从signalr api中,改变的数据和未改变的数据都在 console.log中出现,如下图。在数据库中,我把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" });
}
角度部分
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
在 RealTimeDahboard()
函数上面的结果来了。所以我的图表总是在变化。当我用两个用户同时打开时,就会发生这种情况。如果我打开一个用户,它的工作正常.什么原因?
谢谢你的帮助
这证明发生,因为当你的第二个用户连接到枢纽,并调用你的方法,它实例化了 new TimerManeger()
所以你有2个实例调用枢纽方法。_hub.Clients.All.SendAsync()
.
因此,如果你将有10个用户,你将收到10倍的数据,每个定时器滴答。
你在这里做什么用signalr是不正确的事情。当你的客户端连接到集线器,它不应该触发一个 http
方法。我建议只需将你的客户添加到一个图表组,然后你的定时器服务将更新的图表数据发送给连接到该组的所有客户。
我有一个GitHub项目,也使用SignalR实时刷新图表数据,你可以看到我是如何处理你的类似问题的。你可以看看 此处.
我在GitHub上有一个类似的项目与图表,你可以看到它是如何做到的。