SignalR 中的“无法访问已处置的对象”崩溃

我有一个带有计时器的测试中心,可以将日期发送给所有客户端。


客户端连接后,它会崩溃并出现以下错误:无法访问已处置的对象。


这是错误:


System.ObjectDisposedException: Cannot access a disposed object.

Object name: 'MyHub'.

   at Microsoft.AspNetCore.SignalR.Hub.CheckDisposed()

   at Microsoft.AspNetCore.SignalR.Hub.get_Clients()

这是集线器代码:


public class MyHub : Hub

{

    public MyHub()

    {

        Program.T = new Timer(TickTimer, null, 1000, 1000);

    }


    private void TickTimer(object State)

    {

        try

        {

            var Time = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture);

            Console.WriteLine(Time);


            Clients.All.SendCoreAsync("update", new object[] { Time });

        }

        catch (Exception E)

        {

            Console.WriteLine(E);

            throw;

        }

    }

}

看起来Clients对象已被处理掉,但我不明白为什么。




杨魅力
浏览 123回答 2
2回答

慕莱坞森

集线器生命周期是每个请求(请参阅https://learn.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-3.1上的注释),因此您会因为访问属性(客户端)而处理异常) 的处置对象。当您想向集线器外部的客户端发送消息时(并且您在外部,因为对计时器做出反应,因此在 .netcore 集线器生命周期之后)您应该使用 IHubContext(您可以通过 DI 获得),看看在https://learn.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-3.1

PIPIONE

集线器是瞬态的:不要将状态存储在集线器类的属性中。每个集线器方法调用都在新的集线器实例上执行。在调用依赖于集线器保持活动状态的异步方法时使用等待。例如,如果在没有 await 的情况下调用 Clients.All.SendAsync(...) 之类的方法并且集线器方法在 SendAsync 完成之前完成,则该方法可能会失败。在此处输入链接描述
打开App,查看更多内容
随时随地看视频慕课网APP