【发布时间】: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