我有一个集线器,它的设置如下:
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
是使用SqlDependency
监视表上的更改的类,并注册为单例。当未订阅JobUpdated
事件(或未触发事件)时,集线器工作正常。
但是当事件被触发时,出现以下异常:
无法访问已处置的对象。对象名称:“ MainHub”。
为什么会出现此错误?
并且如果我交换DI的方式是将集线器注入到作业管理器中(因为此类是单身人士,则我认为集线器将不会被处置。
看来您的问题是,当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);
}
}
由于我不知道真正的功能,因此您需要在此处修复该功能的签名。