我有一个通知中心,它是一个每隔几秒钟在后台运行的singelton,并从DB获取新通知,如果有订阅他的事件,他会使用新通知触发事件。
另一方面,我有一个signalR客户端订阅此事件,如下所示:
public void Subscribe()
{
NotificationCenter.OnNotificationArrived += PublishNotifications;
}
在同一个集线器上,我有这个删除订阅的方法:
public override System.Threading.Tasks.Task OnDisconnected()
{
NotificationCenter.OnNotificationArrived -= PublishNotifications;
return base.OnDisconnected();
}
PublishNotifications方法也位于同一个集线器中。
当我调试我的代码时,我可以看到该事件最初为空。 第一次订阅后,该事件包含一个方法。 在另一个订阅后,该事件包含2个方法。 删除订阅后,事件仍然包含2个方法。
知道我做错了什么吗?
btw:我正在使用signalr 1.2
答案 0 :(得分:2)
我认为我学会了一个重要的概念,应该与其他SignalR新手共享。
我认为当SignalR在浏览器和服务器之间建立连接时,它还会创建Hub实例并为整个会话保留它,我错了。看起来SignalR保持连接,每次客户端调用Hub时,在请求结束时创建并处理新的Hub实例。这就是我无法取消订阅通知中心的原因。
我所要做的就是通过在后台连接并运行的同一个实例取消订阅通知中心。
感谢Jon的启发!