我有一个SignalR中心,它正在向网页中的Javascript客户端推送一些数字增量(和减量)。 ASP.NET MVC页面最初从数据库中提取初始值,然后SignalR启动。这些方法通常被调用,但有些方法会丢失。例如:
x
的初始值为100000。x
的值在客户端增加了大约50-60次,所以说x
变为100055。x
,它的实际值为100100. 集线器代码非常简单,我在数据来自服务器时进行日志记录:
$(function () {
var connection = $.connection.adminhub;
var myToken = "@ViewBag.Code";
connection.client.increment = function (data) {
console.log("SignalR: increment " + data);
var num = parseInt($("#" + data).text());
$("#" + data).text(num + 1);
};
connection.client.decrement = function (data) {
console.log("SignalR: decrement " + data);
var num = parseInt($("#" + data).text());
$("#" + data).text(num - 1);
};
console.log("Connecting to SignalR...");
$.connection.hub.start().done(function () {
console.log("Connected to SignalR.");
connection.server.registerForIndex(myToken);
});
});
ViewBag.Code
是由服务器编写的特殊标记,它可以工作(否则它无法接收任何数据)。服务器上只有一个地方调用了集线器的方法:
static IHubContext Instance{
get
{
return GlobalHost.ConnectionManager.GetHubContext<AdminHub>();
}
}
public static void Increment(string key)
{
Instance.Clients.Group("stats").increment(key);
}
我的客户已在stats
群组中注册。我尝试过不同的浏览器和不同的操作系统,它们的行为完全相同。我检查了生命周期事件,没有连接减速,断开连接,重新连接。我使用websockets传输连接,我与Internet和服务器的连接非常稳定。为什么我的价值下降了约50%,我该如何纠正这种行为呢?
答案 0 :(得分:1)
请记住,从signalr检索数据是一种异步操作。尽管Javascript是单线程的,但是在另一个请求从html元素中选择相同的数字之前,您无法确定所选数字是否会增加。可能会扩展您的日志方法,以查看从HTML元素中实际选取的数字。
但是,每分钟100次增量应该是可行的。我建议订阅生命周期事件并查看连接状态。也许连接速度很慢或需要经常重新连接。
http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client#connectionlifetime