如何解决无法访问已处置的对象使用SignalR和Timer Manager
我想让我的函数实时发送数据(每2秒或数据库表中发生一次更改),但是问题是我的以下代码中存在Exception keep appread。
异常详细信息为:
# Create a scrapy.Item class which will hold all the scraped data
class Quote(scrapy.Item):
text = scrapy.Field()
# any additional info you want to put in a quote...
class QuoteSpider(scrapy.Spider):
...
def parse(self,response):
quotes = response.css('div .quoteText::text').extract()
for quote in quotes:
if len(quote) > 10:
# We return a Quote scrapy.Item instead of a string!
yield Quote(text=quote)
'Cannot access a disposed object.
并且TimerManager代码为
public class MyHub : Hub
{
private readonly IRepository<MyTable,long> _repository;
private readonly IUnitOfWorkManager _unitOfWorkManager;
public HCHub(IUnitOfWorkManager unitOfWorkManager,IRepository<MyTable,long> repository)
{
_repository = repository;
_unitOfWorkManager = unitOfWorkManager;
}
public void Get(TestDto testDto)
{
try {
using (var unitOfWork = _unitOfWorkManager.Begin())
{
var result= _repository.GetDbContext().Set<MyTable>()
.Include(x => x.list)
.ThenInclude(x => x.list2)
.ThenInclude(x => x.obj).ToList();
new TimerManager(async () =>
await Clients.All.SendAsync("listen",result) //<====== in this Line the exception occured
);
}
}
catch(Exception ex)
{
throw new UserFriendlyException(ex.InnerException.Message.ToString());
}
}
因此问题出在 Timer Manager 或 myHub 中,或者我无法通过 TimerManager 模拟实时数据的方式?!
解决方法
一旦退出集线器方法,就不能保证可以访问Clients
属性。如果要执行类似的操作,则应将IHubContext<THub>
注入到Hubs构造函数中,并改用它。您可以在https://docs.microsoft.com/aspnet/core/signalr/hubcontext?view=aspnetcore-3.1#get-an-instance-of-ihubcontext
IHubContext
的更多信息
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。