2

我在我的服务器解决方案中创建了后台服务

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:“无法访问已处置的对象。”

我怎样才能正确地实现这一点?

4

2 回答 2

1

您的构造函数似乎正在建立一个范围,并立即处置该范围。由于using.

后台服务通常是单例,其生命周期等同于应用程序的生命周期。在我看来,您应该将您的服务注册为服务类本身之外的单例。就像是

public class PurgeService : IHostedService
{
   // no weird constructor taking in IServiceProvider
}

此外,在类中使用 IoC 有点反模式。注入数据库上下文工厂,而不是尝试通过类中的容器进行解析。

于 2021-09-14T00:17:25.373 回答
-1

问题是数据库表是空的,但是空异常抛出了一个完全不同的异常。

于 2021-09-14T09:06:48.427 回答