使用带有signalR事件的javascript计时器来检查新数据

时间:2013-09-27 09:16:07

标签: javascript signalr

我有这个表,有一组行,每行都使用与signalR的唯一连接。这允许我使用唯一内容同时更新多个行。 它的工作方式是每次远程单元发送新消息时,服务总线为messagehub提供新值和uniqe id以与该值一起使用。

此时我想每隔10秒检查一次,看看网络服务器是否仍然收到来自该设备的消息,只要它还活着就会发送消息。换句话说,如果自上次SignalR给我一个值以来超过10秒,这将表明与远程单元的连接丢失。 (不要误认为SignalR失去了连接)

由于我的表中有很多单位(行),我想知道每行的javascript计时器是否足以进行此检查,或者有更好的方法吗?如果是这样,我可以在我的连接器脚本或我的HTML中执行此操作吗?

2 个答案:

答案 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; }
    }
}