我有这个表,有一组行,每行都使用与signalR的唯一连接。这允许我使用唯一内容同时更新多个行。 它的工作方式是每次远程单元发送新消息时,服务总线为messagehub提供新值和uniqe id以与该值一起使用。
此时我想每隔10秒检查一次,看看网络服务器是否仍然收到来自该设备的消息,只要它还活着就会发送消息。换句话说,如果自上次SignalR给我一个值以来超过10秒,这将表明与远程单元的连接丢失。 (不要误认为SignalR失去了连接)
由于我的表中有很多单位(行),我想知道每行的javascript计时器是否足以进行此检查,或者有更好的方法吗?如果是这样,我可以在我的连接器脚本或我的HTML中执行此操作吗?
答案 0 :(得分:1)
每10秒触发一次计时器并扫描所有信号器连接应该可以正常工作。
答案 1 :(得分:0)
好的,所以我用另一种方式解决了这个问题,让我的消息处理程序负责在正确的时间分发消息的任务:
public class AsxActivityAliveEventMessageHandler : IHandleMessages<AsxActivityAliveEvent>
{
private const double INTERVAL = 10000;
public static bool AsxConnected { get; set; }
private static Dictionary<String, TagTimer> _connectionTimers = new Dictionary<string, TagTimer>();
public void Handle(AsxActivityAliveEvent message)
{
AsxConnected = true;
NotifyClients(message);
TagTimer timer;
if (_connectionTimers.ContainsKey(message.ConveyanceId))
{
timer = _connectionTimers[message.ConveyanceId];
if (timer != null)
{
timer.Stop();
timer.Elapsed -= timer_Elapsed;
_connectionTimers.Remove(message.ConveyanceId);
}
}
timer = new TagTimer
{
Interval = INTERVAL,
Tag = message
};
timer.Elapsed += timer_Elapsed;
_connectionTimers.Add(message.ConveyanceId, timer);
timer.Start();
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
var timer = sender as TagTimer;
if (timer != null)
{
timer.Stop();
timer.Elapsed -= timer_Elapsed;
}
AsxConnected = false;
if (timer != null)
{
NotifyClients(timer.Tag as AsxActivityAliveEvent);
}
}
static void NotifyClients(AsxActivityAliveEvent message)
{
var messageHub = GlobalHost.ConnectionManager.GetHubContext<MessageHub>();
var conveyanceId = message.ConveyanceId;
// Removed some vars and notify's as they're not relevant to this example
messageHub.Clients.Group(message.ConveyanceId).notifyAlive(AsxConnected, conveyanceId);
}
}
internal class TagTimer : Timer
{
public object Tag { get; set; }
}
}