为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
杨魅力 2022-12-24 14:00:34
我有一个带有计时器的测试中心,可以将日期发送给所有客户端。客户端连接后,它会崩溃并出现以下错误:无法访问已处置的对象。这是错误: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对象已被处理掉,但我不明白为什么。
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

集线器生命周期是每个请求(请参阅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


查看完整回答
反对 回复 2022-12-24
?
PIPIONE

TA贡献1829条经验 获得超9个赞

集线器是瞬态的:

不要将状态存储在集线器类的属性中。每个集线器方法调用都在新的集线器实例上执行。在调用依赖于集线器保持活动状态的异步方法时使用等待。例如,如果在没有 await 的情况下调用 Clients.All.SendAsync(...) 之类的方法并且集线器方法在 SendAsync 完成之前完成,则该方法可能会失败。在此处输入链接描述


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号