前言
Asp.net core作為一種高效、跨平台的web架構,在開發過程中,我們常常需要在背景執行定時任務,例如清理無用檔案、生成報告、發送郵件等任務。對于這種需求,我們可以使用第三方庫(如Hangfire或Quartz.NET)來實作任務排程和執行,也可以使用asp.net core自帶的Hosting子產品和System.Timers.Timer類來實作簡單的定時任務。
本篇文章主要介紹如何使用Asp.net core自帶的Hosting子產品和System.Timers.Timer類,以及Hangfire和Quartz.NET分别實作定時任務。将展示一個完整的示例代碼,并詳細解釋代碼中各個部分的含義和作用,以幫助了解實作過程和相關知識點。
自帶的Hosting子產品實作任務排程
下面将分步驟詳細介紹如何使用asp.net core自帶的Hosting子產品和System.Timers.Timer類來實作定時任務。
- 建立一個控制台應用程式
首先,在Visual Studio中建立一個控制台應用程式。
- 添加必要的NuGet包
在項目中添加以下NuGet包:
- Microsoft.Extensions.Hosting.Abstractions
- Microsoft.Extensions.Hosting
這兩個NuGet包提供了asp.net core的Hosting子產品和應用程式生命周期管理功能。
- 建立一個HostBuilder對象
在Main方法中建立一個HostBuilder對象:
static void Main(string[] args)
{
var builder = new HostBuilder()
.UseConsoleLifetime() // 控制台生命周期管理
.ConfigureServices((hostContext, services) =>
{
// 配置服務
});
builder.Build().Run();
}
HostBuilder提供了配置應用程式服務、托管生命周期、配置應用程式配置等功能。可以使用UseConsoleLifetime方法來配置應用程式的控制台生命周期管理。
- 添加定時任務
在ConfigureServices方法中添加定時任務:
ConfigureServices((hostContext, services) =>
{
// 添加定時器元件
services.AddHostedService<MyTimer>();
});
上面的代碼中,我們向服務容器中添加了一個MyTimer類,這個類實作了IHostedService接口。
- 實作IHostedService接口
在MyTimer類中實作IHostedService接口:
// MyTimer.cs
public class MyTimer : IHostedService, IDisposable
{
private readonly Timer _timer;
public MyTimer()
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); // 每5秒執行一次DoWork方法
}
public Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("定時任務已啟動");
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("定時任務已停止");
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
private void DoWork(object state)
{
Console.WriteLine(#34;定時任務執行中,目前時間:{DateTime.Now}");
}
}
MyTimer類繼承了IHostedService接口,該接口定義了應用程式生命周期管理的方法。在MyTimer的構造函數中,我們建立了一個計時器,并在每5秒鐘的時間間隔内執行DoWork方法。在StartAsync方法中,輸出“定時任務已啟動”資訊;在StopAsync方法中,輸出“定時任務已停止”資訊。Dispose方法用于釋放計時器資源。
- 運作應用程式
完成上面的步驟後,我們可以運作應用程式,觀察控制台輸出的結果。
每5秒鐘控制台會輸出一條類似于“定時任務執行中,目前時間:2023/06/12 15:34:48”的資訊,表示定時任務正在運作。當我們手動停止應用程式時,控制台會輸出“定時任務已停止”資訊,表示定時任務已經被成功停止。
至此,我們成功地使用asp.net core自帶的Hosting子產品和System.Timers.Timer類實作了定時任務。在實際應用中,可以根據需求添加更多的定時任務,并調整計時器的時間間隔等參數。
Hangfire實作任務排程
下面将詳細介紹如何使用asp.net core引入Hangfire來實作任務排程和執行。
- 建立一個asp.net core Web應用程式
首先,在Visual Studio中建立一個asp.net core Web項目。
- 添加必要的NuGet包
在項目中添加以下NuGet包:
- Hangfire.AspNetCore
- Hangfire.SqlServer
這兩個NuGet包提供了Hangfire架構所需的元件和功能。
- 配置Hangfire
在Startup.cs檔案中配置Hangfire:
public void ConfigureServices(IServiceCollection services)
{
// 配置Hangfire
GlobalConfiguration.Configuration.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection"));
services.AddHangfire(config => config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));
services.AddHangfireServer();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 啟用Hangfire儀表闆
app.UseHangfireDashboard();
// ...
}
上述代碼中,我們在ConfigureServices方法中配置了Hangfire,并使用AddHangfireServer方法啟用了Hangfire服務。同時,我們也針對資料庫進行了配置。
在Configure方法中,我們除了啟用了Hangfire儀表闆之外,還需要在中間件管道中注冊Hangfire服務:
app.UseHangfireServer();
- 添加定時任務
在Actions檔案夾内建立ScheduledTasks類,并添加定時任務:
public class ScheduledTasks
{
public void DoSomething()
{
Console.WriteLine("Hangfire: Doing something...");
}
public void DoSomethingElse()
{
Console.WriteLine("Hangfire: Doing something else...");
}
}
在上面的代碼中,我們建立了兩個定時任務:DoSomething和DoSomethingElse。
- 注冊定時任務
在ConfigureServices方法中注冊定時任務:
services.AddTransient<ScheduledTasks>();
// 注冊定時任務
RecurringJob.AddOrUpdate<ScheduledTasks>(x => x.DoSomething(), Cron.Minutely);
RecurringJob.AddOrUpdate<ScheduledTasks>(x => x.DoSomethingElse(), Cron.Hourly);
在上面的代碼中,我們使用AddOrUpdate方法來注冊定時任務。第一個參數為委托表達式,指定了要執行的任務;第二個參數為Cron表達式,指定了任務的執行時間。
在上面的代碼中,我們每分鐘執行DoSomething任務,每小時執行DoSomethingElse任務。
- 運作應用程式
完成上面的步驟後,我們可以運作應用程式在Hangfire儀表闆中檢視定時任務的執行情況。
在儀表闆的"Recurring jobs"頁籤中,我們可以看到我們剛剛注冊的兩個定時任務以及它們的下一次執行時間。在任務執行時,我們可以在控制台輸出中看到“Hangfire: Doing something…”或“Hangfire: Doing something else…”等資訊,表示任務已經被成功執行。
至此,我們成功地使用asp.net core引入Hangfire來實作任務排程和執行,并注冊了兩個定時任務進行示範。在實際應用中,我們可以根據需求添加更多的定時任務,并根據具體業務場景進行調整和優化。
Quartz來實作任務排程
詳細的用法,可以參閱我之前的文章:快速掌握Quartz.Net計劃任務排程架構,輕松實作定時任務
#如何提升個人的程式設計能力#