0

我有这张表,有一组行,每行都使用到 signalR 的唯一连接。这使我可以使用独特的内容同时更新多行。它的工作方式是,每次远程单元传输新消息时,服务总线都会为消息集线器提供新值和与该值对应的唯一 ID。

在这一点上,我想每 10 秒运行一次检查,看看网络服务器是否仍然从该单元获得一条消息,只要它还活着,它就会传输这个消息。换句话说,如果自上次 SignalR 给我一个值以来超过 10 秒,这将表明与远程单元的连接丢失。(不要误认为 SignalR 失去连接)

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

4

2 回答 2

1

每 10 秒触发一次并扫描所有信号器连接的单个计时器应该可以正常工作。

于 2013-09-30T17:25:38.490 回答
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; }
    }
}
于 2013-10-01T06:11:54.100 回答