c# - ASP.NET Core 应用程序中的 IHostedService 错误 - 为什么对象已被释放?
问题描述
我在我的服务器解决方案中创建了后台服务
public class PurgeService : IHostedService, IDisposable
{
private readonly IServiceProvider _provider;
private Timer timer;
public PurgeService(IServiceProvider serviceProvider)
{
using (IServiceScope scope = serviceProvider.CreateScope())
{
_provider = scope.ServiceProvider;
}
}
public void Dispose()
{
timer?.Dispose();
}
public Task Purge(IServiceProvider serviceProvider)
{
var dbcontext = serviceProvider.GetRequiredService<ApplicationDBContext>();
var setting = dbcontext.AppSet.First();
double deletetime = setting.PurgeTimer *(1);
DateTime deletedate = DateTime.Now.AddHours(deletetime);
string deleteSQL = $"DELETE FROM Notifications WHERE CreatedDate > {deletedate}"
}
public Task StartAsync(CancellationToken cancellationToken)
{
timer = new Timer(x => Purge(_provider), null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
并将其添加到 Startup.cs
services.AddHostedService<PurgeService>();
我的目标是拥有一个后台服务,每 10 秒检查一次是否有超过允许的通知并删除它们。
但是当我运行应用程序时发生错误
“System.ObjectDisposedException:“无法访问已处置的对象。”
我怎样才能正确地实现这一点?
解决方案
您的构造函数似乎正在建立一个范围,并立即处置该范围。由于using
.
后台服务通常是单例,其生命周期等同于应用程序的生命周期。在我看来,您应该将您的服务注册为服务类本身之外的单例。就像是
public class PurgeService : IHostedService
{
// no weird constructor taking in IServiceProvider
}
此外,在类中使用 IoC 有点反模式。注入数据库上下文工厂,而不是尝试通过类中的容器进行解析。
推荐阅读
- javascript - 使用“onclick”事件模拟元素的中间点击
- excel - Excel VBA在数字字符串中添加零
- algorithm - 在其并集是整个图的图中找到大小相等的互斥完整子图
- r - R Shiny App HighCharter OHLC/Candlesticks 默认缩放周期
- java - string.replace() 中预期的变量
- matlab - 在 Matlab 和 Julia 中读取二进制文件时的不同输出
- angular - 如何测试在其他函数中调用的异步函数?
- c++ - .exe 不能在路径中使用多个“../”实例运行
- r - 使用 tidyverse 将数据拆分为列表并在每个列表中进行操作
- r - 在ggplot散点图中拟合两条线