【问题标题】:SignalR Core throws disposed exceptionSignalR Core 抛出已处理的异常
【发布时间】:2020-07-14 19:51:18
【问题描述】:

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

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】:

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

    你需要在那里修复函数的签名,因为我不知道真正的签名。

    【讨论】:

    • 现在工作正常!!
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2013-07-24
    • 1970-01-01
    • 2011-10-10
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多