signalr发送组延迟通知

时间:2014-12-18 08:40:14

标签: asp.net asp.net-mvc signalr

我有一个信号应用程序。我有一个并发连接问题最大化iis。为了避免这种情况,我希望我的集线器向25个包中创建的组发送通知,延迟假设为500毫秒。我在连接时将用户添加到组。在计数25后,我将它们添加到下一组。需要如何向每个组发送延迟500毫秒的通知。 我已经遍历了多个组并使用了

Thread.Sleep(500);

但所有已连接的用户都没有收到通知

1 个答案:

答案 0 :(得分:0)

您的问题几乎描述了解决方案 - 缓冲500毫秒的通知然后发送所有这些通知的数组。

您可以通过在队列或列表中推送通知来执行此操作,并使用计时器每500毫秒发送一次通知。

更好的解决方案是使用Reactive Extensions和Observable.Buffer(Timespan)方法,从而避免队列和计时器。

Subject<string> _subject;

.....
public void InitSubject()
{
    _subject=new Subject<string>();
    _subject.Buffer(Timespan.FromMilliseconds(500))
            .Subscribe(notifications=>SendBatch(notifications));
}
....
public void SendBatch(IList<string> notifications)
{
    //Get hold of the SignalR context and send the notifications here
}

public void QueueNotification(string notification)
{
    _subject.OnNext(notification);
}

缓冲区还允许您批量处理特定数量的通知,或者使用时间跨度和项目限制来在达到其中一个限制时发送批处理。

您的代码应致电QueueNotification,而不是直接发送通知。 Reactive Extensions还提供LINQ扩展,因此您可以使用Where()方法应用过滤,例如,为不同的用户组使用不同的延迟,完全绕过缓冲,或使用任何其他组合。

您应该注意,由于Hub是暂时的,您不能将您的主题放在集线器中,尽管您可以将QueueNotification放在那里,前提是您在某处提供了对主题的引用,例如使用依赖注入初始化集线器