我可以 Task.Delay() 1 天吗?

Can I Task.Delay() for 1 day?

我需要每天对我的数据库进行一次清理。我正在使用 BackgroundService:

public class DbCleanerService : BackgroundService
{    
    public DbCleanerService(IServiceProvider services)
    {
        Services = services;
    }

    public IServiceProvider Services { get; }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // get a db context and do the cleanup

            await Task.Delay(TimeSpan.FromDays(1), stoppingToken);
        }
    }
}

有没有我不知道的陷阱?长时间延迟会不会有什么问题?例如,我在很多地方都读到这对 IIS 托管的网站不安全,因为 IIS 可能会关闭其未使用的网站。 (虽然我没有使用 IIS)

我在 Ubuntu 服务器 18.04 上使用 ASP.NET Core 6 和 Kestrel。

安装FluentScheduler

对于没有 Startup.cs 的新 Asp.Net 6.0 在 var app = builder.Build(); 之后将其添加到您的 Program.cs

JobManager.Initialize();
JobManager.AddJob(RunMyJob, s => s.ToRunNow().AndEvery(1).Days());

void RunMyJob()
{
    // Do What You Want
    var dbContext = app.Services.GetRequiredService<ApplicationDbContext>(); // Injecting Services
    
}

这将 运行 每天“RunMyJob”

如果您正在使用 startup.cs,请将此添加到您的启动配置部分

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ApplicationDbContext applicationDbContext) // Injecting ApplicationDbContext Service
{
    JobManager.Initialize();
    JobManager.AddJob(RunMyJob, s => s.ToRunNow().AndEvery(1).Days());

    void RunMyJob()
    {
        // Do What You Want
 

    }

...

}

有关详细信息,请访问 FluentScheduler Docs

回答你的实际问题。 Task.Delay 可以 用于延迟最多 int.MaxValue。所以是的,你的代码没问题。

现在正如您所指出的,如果您不小心 IIS 可以关闭网站,而且在重新部署的情况下,您的应用程序将重新启动并且您没有任何办法(在您现有的代码中),跟踪您的进度。在那些情况下,使用像 Hangfire 这样的东西会更好。

但是,假设您的 DB Cleaner 服务可以每天 运行 多次(例如,它只是清理旧记录,而不是 需要 成为 运行 一次且每天仅一次),那么您可能根本不在乎。