bin*_*nks 5 c# signalr signalr-hub signalr.client .net-core
我遇到一个奇怪的问题,其中使用 SignalR 发送到多个客户端的回调对于某些客户端来说会延迟。
正如您所看到的,客户端 A 接收回调和客户端 B 接收回调之间有整整 7 秒的延迟。
有一个“主”客户端在计时器结束时执行调用:
vm.bettingconnection
.invoke("MoveToNextRound", gameId)
.catch(function (err) {
return console.error(err.toString());
});
Run Code Online (Sandbox Code Playgroud)
“vm”是一个 VueJS 对象
var vm = new Vue({
el: '#gamesquares',
data: function () {
return {
rawgamedata: [],
connection: "",
bettingconnection: "",
scorepredictShow: true,
boardShow: false,
timerShow: false,
expectationShow: false,
restseconds: 0,
roundseconds: 0,
restsecondsleft: 0,
roundsecondsleft: 0,
roundsleft: 0,
currentround: 0,
gamemode: 0,
estimatedpoints: 0,
scoreindex: 0,
currentscore: 0,
targetscore: 0
};
},
Run Code Online (Sandbox Code Playgroud)
被调用的端点的逻辑非常简单:
public async Task MoveToNextRound(Guid gameId)
{
int roundNumber = _gameAdministration.NextRound(gameId);
//need a try catch //game not found
await Clients.Groups(gameId.ToString()).MovedToNextRound(roundNumber);
}
Run Code Online (Sandbox Code Playgroud)
NextRound里面就是这个(也很简单)
public int NextRound(Guid gameId)
{
int roundNumber = _cache.Get<int>(gameId.ToString() + "-roundnumber");
roundNumber++;
_cache.Set(gameId.ToString() + "-roundnumber", roundNumber);
return roundNumber;
}
Run Code Online (Sandbox Code Playgroud)
所以这就是我认为问题所在的地方:
await Clients.Groups(gameId.ToString()).MovedToNextRound(roundNumber);
Run Code Online (Sandbox Code Playgroud)
为什么回调需要一段时间才能到达某些客户端?
调用回调的代码似乎没有任何问题。回调结果将被返回,然后将结果发送给指定组内的客户端。
如果所有客户端都在同一台计算机上,则延迟可能是由于资源争用造成的。
如果客户端位于不同的计算机上/属于不同类型的客户端,您可能需要检查每个客户端用于接收消息的协议。
无论如何,您应该使用 SignalR 诊断日志记录来收集有关此处到底出了什么问题的更多信息。有关如何执行此操作的详细信息,请访问:https://learn.microsoft.com/en-us/aspnet/core/signalr/diagnostics ?view=aspnetcore-7.0
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |