我需要每天在我的資料庫中進行一次清理。我正在使用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 Server 18.04 上使用 ASP.NET Core 6 和 Kestrel。
uj5u.com熱心網友回復:
回答你的實際問題。Task.Delay可用于延遲至 int.MaxValue。所以是的,你的代碼沒問題。
現在正如您所指出的,如果您不小心,IIS 可以關閉網站,而且在重新部署場景期間,您的應用程式將重新啟動并且您沒有任何方法(在您現有的代碼中)來跟蹤您的位置取決于。在這些情況下,使用像 Hangfire 這樣的東西會更好。
但是,假設您的 DB Cleaner 服務可以每天運行多次(例如,它只是清理舊記錄并且不需要每天只運行一次),那么您甚至可能不在乎。
uj5u.com熱心網友回復:
安裝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檔案
uj5u.com熱心網友回復:
我會推薦你Hangfire。Hangfire 具有重復作業功能。
重復作業在指定的 CRON 計劃上多次觸發。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419183.html
標籤:
上一篇:異步任務中沒有例外記錄
