我有一个通知中心,它是一个单例,每隔几秒在后台运行一次,并从数据库中获取新通知,如果有订阅他的事件,他就会用新通知触发该事件。
另一方面,我有一个订阅此事件的 signalR 客户端:
public void Subscribe()
{
NotificationCenter.OnNotificationArrived += PublishNotifications;
}
在同一个集线器上,我有这种删除订阅的方法:
public override System.Threading.Tasks.Task OnDisconnected()
{
NotificationCenter.OnNotificationArrived -= PublishNotifications;
return base.OnDisconnected();
}
PublishNotifications 方法也位于同一个中心。
当我调试我的代码时,一开始我可以看到该事件为空。 第一次订阅后,事件持有一个方法。 在另一个订阅之后,该事件包含 2 个方法。 删除订阅后,该事件仍然包含 2 个方法。
知道我做错了什么吗?
顺便说一句:我正在使用 signalr 1.2
最佳答案
我想我学到了一个重要的教训,应该与其他 SignalR 新手分享。
我认为当 SignalR 在浏览器和服务器之间创建连接时,它还会创建 Hub 实例并在整个 session 期间保持它,我错了。看起来 SignalR 在幕后保持连接,每次客户端调用集线器时,都会在请求结束时创建并处理新的集线器实例。这就是我无法取消订阅通知中心的原因。
我所要做的就是通过 Hook 并在后台运行的同一个实例取消订阅通知中心。
感谢 Jon 的启发!
关于c# - 无法从 singelton 事件取消订阅 signalR 集线器功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21302518/