我可以 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。
对于没有 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 服务可以每天 运行 多次(例如,它只是清理旧记录,而不是 需要 成为 运行 一次且每天仅一次),那么您可能根本不在乎。
我需要每天对我的数据库进行一次清理。我正在使用 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。
对于没有 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 服务可以每天 运行 多次(例如,它只是清理旧记录,而不是 需要 成为 运行 一次且每天仅一次),那么您可能根本不在乎。