SignalR Core 抛出异常
SignalR Core throws disposed exception
我有一个集线器,它的设置如下:
public class MainHub : Hub<IMainHub>
{
private readonly IJobManager jobManager;
public MainHub(
IJobManager jobManager)
{
this.jobManager = jobManager;
this.jobManager.JobUpdated += async (s, e) =>
{
await Clients.Group(e.Group).JobUpdate(e.Job);
};
}
]
IJobManager
是一个 class,它使用 SqlDependency
来监视 table 上的更改,并注册为单例。集线器在未订阅 JobUpdated
事件(或事件未触发)时工作正常。
但是当事件被触发时,我得到以下异常:
Cannot access a disposed object. Object name: 'MainHub'.
为什么会出现这个错误?
如果我交换 DI,我将 hub 注入到作业管理器中(因为这个 class 是一个单例),我假设 hub 不会被释放。
看起来你的问题是当 MainHub
完成它的工作时你没有注销事件侦听器。你无法控制那个实例的一个实例能活多久...
不要使用匿名函数并注销事件侦听器。
public class MainHub : Hub<IMainHub>
{
private readonly IJobManager jobManager;
public MainHub(
IJobManager jobManager)
{
this.jobManager = jobManager;
this.jobManager.JobUpdated += OnJobUpdated;
}
private async void OnJobUpdated(object s, Event e)
{
await Clients.Group(e.Group).JobUpdate(e.Job);
}
protected override void Dispose(bool disposing)
{
if (disposing) {
this.jobManager.JobUpdated -= OnJobUpdated;
}
base.Dispose(disposing);
}
}
你需要修复那里的函数签名,因为我不知道真正的签名。
我有一个集线器,它的设置如下:
public class MainHub : Hub<IMainHub>
{
private readonly IJobManager jobManager;
public MainHub(
IJobManager jobManager)
{
this.jobManager = jobManager;
this.jobManager.JobUpdated += async (s, e) =>
{
await Clients.Group(e.Group).JobUpdate(e.Job);
};
}
]
IJobManager
是一个 class,它使用 SqlDependency
来监视 table 上的更改,并注册为单例。集线器在未订阅 JobUpdated
事件(或事件未触发)时工作正常。
但是当事件被触发时,我得到以下异常:
Cannot access a disposed object. Object name: 'MainHub'.
为什么会出现这个错误?
如果我交换 DI,我将 hub 注入到作业管理器中(因为这个 class 是一个单例),我假设 hub 不会被释放。
看起来你的问题是当 MainHub
完成它的工作时你没有注销事件侦听器。你无法控制那个实例的一个实例能活多久...
不要使用匿名函数并注销事件侦听器。
public class MainHub : Hub<IMainHub>
{
private readonly IJobManager jobManager;
public MainHub(
IJobManager jobManager)
{
this.jobManager = jobManager;
this.jobManager.JobUpdated += OnJobUpdated;
}
private async void OnJobUpdated(object s, Event e)
{
await Clients.Group(e.Group).JobUpdate(e.Job);
}
protected override void Dispose(bool disposing)
{
if (disposing) {
this.jobManager.JobUpdated -= OnJobUpdated;
}
base.Dispose(disposing);
}
}
你需要修复那里的函数签名,因为我不知道真正的签名。