问题描述
我想让我的函数实时发送数据(每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
的更多信息