ASP.Net Core的BackgroundService无故取消

3

我开发了一个后台服务(BackgroundService),一开始工作得很好。但之后大约20分钟后,由于某些我不知道的原因,服务被取消了。 对于这种情况,"job"应该是无限的,永远不会结束。请问,你能给一些建议吗?我会感激不尽。

public class CheckItemsService : BackgroundService
{
    private IConfiguration Configuration { get; }

    public CheckItemsService(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        stoppingToken.Register(() => Log.Information("Job is stopping"));

        while (!stoppingToken.IsCancellationRequested)
        {
            await UpdateItems();

            await Task.Delay(1000 * 60, stoppingToken);
        }
    }

    private async Task UpdateItems()
    {
        var optionsBuilder = new DbContextOptionsBuilder<WalletContext>();
        optionsBuilder.UseSqlServer(Configuration.GetSection("ConnectionStrings:Default").Value);
        DbContext _context = new DbContext(optionsBuilder.Options);

        var items = await _context.EntityX.ToListAsync();

        foreach (var item in items)
        {
            item.ModificationDate = DateTime.Now;
        }

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateException dbEx)
        {
            Log.Information(dbEx.Message);
        }
    }
}

3
如果调用了 StopAsync(CancellationToken),则覆盖该方法并让它记录是否已被调用。如果是,则说明主机由于某种原因正在关闭。 - Scott Chamberlain
如果您将其托管在IIS上,例如,它可能是默认应用程序池空闲时间导致其关闭,因为它不会考虑您的后台服务。 - Vidmantas Blazevicius
1个回答

1

@Scott Chamberlain 谢谢你,根据你的评论,我想到了搜索主机关闭的原因,所以我发现IIS每个站点都有一个默认的“不活动”配置,为20分钟。我更改了这个配置,现在它完美地运行着。 @Vidmantas Blazevicius 非常感谢您,确实这是我的问题原因。感谢您的帮助。

我找到解决IIS配置的链接 → 如何防止IIS在不使用时关闭Web站点?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接