尝试将托管服务添加到应用程序时出现问题
我正在尝试将托管服务添加到我的应用程序中,但它似乎根本不起作用(在调试中没有调用它的任何方法)。 这是托管服务的代码:
using Data.Data;
namespace Shop.HostedServices;
public sealed class ChangeOrderStatusHostedService : IHostedService, IDisposable
{
private ApplicationDbContext? _db;
private readonly IServiceScopeFactory _serviceScopeFactory;
private Timer? _timer;
public ChangeOrderStatusHostedService(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
}
public Task StartAsync(CancellationToken stoppingToken)
{
_timer = new Timer(DoWork,
null,
TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object? state)
{
using var scope = _serviceScopeFactory.CreateScope();
_db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
// not important code
_db.SaveChanges();
}
public Task StopAsync(CancellationToken stoppingToken)
{
_timer?.Change(Timeout.Infinite, Timeout.Infinite);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
这就是我在
Program.cs
注册的方式
builder.Services.AddSingleton<ChangeOrderStatusHostedService>(); // here it is
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
花了很多时间试图解决这个问题,但我唯一成功的是现在我的项目至少可以毫无例外地构建。
AddHostedService
扩展方法注册该托管服务,而不是调用 builder.Services.AddSingleton<ChangeOrderStatusHostedService>()
.
builder.Services.AddHostedService<ChangeOrderStatusHostedService>();
如果可能的话,最好从实现BackgroundService
的
IHostedService
继承。
查看文档