我有一个信号应用程序。我有一个并发连接问题最大化iis。为了避免这种情况,我希望我的集线器向25个包中创建的组发送通知,延迟假设为500毫秒。我在连接时将用户添加到组。在计数25后,我将它们添加到下一组。需要如何向每个组发送延迟500毫秒的通知。 我已经遍历了多个组并使用了
Thread.Sleep(500);
但所有已连接的用户都没有收到通知
答案 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
放在那里,前提是您在某处提供了对主题的引用,例如使用依赖注入初始化集线器