c# - 无法从 singelton 事件取消订阅 signalR 集线器功能

标签 c# events delegates signalr-hub

我有一个通知中心,它是一个单例,每隔几秒在后台运行一次,并从数据库中获取新通知,如果有订阅他的事件,他就会用新通知触发该事件。

另一方面,我有一个订阅此事件的 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/

相关文章:

c# - 编译器以什么顺序搜索命名空间/二进制文件以查找变量名?

c# - 查找小于 2 个整数 a 和 b 的 2 个最大数的算法,它们可以被彼此整除

java - 如何在页面加载时触发 servlet 方法

c++ - 是否可以从应用程序外部监听来自该应用程序的事件

ios - Swift - 使用 selectedIndex 更改 var

c# - VIEWS 和 Fluent NHibernate?

c# - var 关键字和使用 namespace

javascript - 使用javascript捕获新的浏览器窗口打开事件

ios - 带有委托(delegate)的 Storyboard模式 Segue

c# - 理解delegate在C#中的具体用法