SignalR Core抛出处置异常

问题描述 投票:0回答:1

我有一个集线器,它的设置如下:

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的方式是将集线器注入到作业管理器中(因为此类是单身人士,则我认为集线器将不会被处置。

c# asp.net-core .net-core asp.net-core-signalr
1个回答
1
投票

看来您的问题是,当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);
    }
}

由于我不知道真正的功能,因此您需要在此处修复该功能的签名。

© www.soinside.com 2019 - 2024. All rights reserved.