【问题标题】:Can't do unsubscribe for signalR hub function from singelton event无法从单次事件中取消订阅 signalR 集线器功能
【发布时间】:2023-03-29 01:19:01
【问题描述】:

我有一个通知中心,它是一个 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 个方法。

知道我做错了什么吗?

顺便说一句:我正在使用信号器 1.2

【问题讨论】:

  • 听起来您在该类的另一个实例上调用 OnDisconnected,而不是在您调用 Subscribe 的实例上。
  • 你是对的,这不是同一个集线器。这是怎么发生的,我该如何解决?
  • 我们无法确定,恐怕......
  • 好的,现在我想我明白这里发生了什么。在来自浏览器的每次信号器调用中,信号器都会为集线器创建新实例。但是当我在通知中心订阅我的集线器时,垃圾收集器无法处理他,这就是为什么我认为它总是同一个集线器。我所要做的就是取消委托调用本身!

标签: c# events delegates signalr-hub


【解决方案1】:

我认为我学到了一个重要的教训,应该与其他 SignalR 新手分享。

我认为当 SignalR 在浏览器和服务器之间创建连接时,它也会创建 Hub 实例并在整个会话期间保持它,我错了。看起来 SignalR 在后台保持连接,每次客户端调用 Hub 时,都会在请求结束时创建和处理新的 Hub 实例。这就是我无法从通知中心退订的原因。

我所要做的就是通过在后台运行的同一个实例从通知中心取消订阅。

感谢乔恩的启发!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2018-09-02
    • 1970-01-01
    • 2023-03-29
    • 2020-10-20
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多