ASP.NET Core使用Hangfire實現定時任務 前言 也是上了5天班,終於迎來了休息,抽空更新下博客,然後就是下周一公司會對我進行考核,希望考核能通過吧!!! 然後我想給博客添加一個定時發佈文章的功能,其實這個功能對於我的博客是沒什麼作用的,什麼時候發都沒什麼人看。但是咱還是要有這個功能。 ...
ASP.NET Core使用Hangfire實現定時任務
前言
也是上了5天班,終於迎來了休息,抽空更新下博客,然後就是下周一公司會對我進行考核,希望考核能通過吧!!!
然後我想給博客添加一個定時發佈文章的功能,其實這個功能對於我的博客是沒什麼作用的,什麼時候發都沒什麼人看。但是咱還是要有這個功能。
實現思路
我為文章表添加了一個Status狀態屬性,然後如果在上傳文章的時候,添加了定時參數,那麼就會進入定時任務的方法。首先無論是否選擇定時發佈,文章都會保存到資料庫。Status狀態預設為1,如果是定時發佈文章的話,Status狀態為0,當到達定時時間後將會執行定時任務,修改Status屬性為發佈也就是1。
實現步驟
第一步:安裝Hangfire包
dotnet add package Hangfire
dotnet add package Hangfire.MemoryStorage //根據需求導入
第二步:配置服務
在配置文件中配置Hangfire
// 添加Hangfire服務
builder.Services.AddHangfire(configuration => configuration.UseMemoryStorage());
// 添加定時任務
builder.Services.AddHangfireServer();
// 使用Hangfire中間件
app.UseHangfireDashboard();
註意我這裡是直接使用的記憶體UseMemoryStorage
作為Hangfire的存儲方式,這個項目還提供了很多比如SQLServer,Redis等,那麼對應的Nuget包也不同,自行參考官方文檔,鏈接在本文底部。
第三步:調度後臺任務
首先是修改狀態的代碼
public void UpdateStatus(string id)
{
var post = _myDbContext.posts.FirstOrDefault(p => p.Id == id);
if (post != null)
{
post.Status = 1;
_myDbContext.SaveChanges();
}
}
Hangfire調用後臺任務的方法是BackgroundJob.Schedule(),裡面需要2個參數,分別是需要定時執行的方法和延遲任務執行的時間。
...上方邏輯代碼,無需展示
if (publishTime.HasValue && publishTime.Value > DateTime.Now)
{
// 計算延遲時間
var delay = publishTime.Value - DateTime.Now;
post.Status = 0;//未發佈
// 使用Hangfire調度後臺任務
BackgroundJob.Schedule( () => UpdateStatus(post.Id) ,delay);
}
else
{
post.Status = 1; //發佈
}
// 存入資料庫
await _myDbContext.SaveChangesAsync();
實現效果
首先發送請求,可以看到啟動了定時任務
然後查詢資料庫,可以看到Status為0。
然後在08分的時候,Status變成了1,也就是發佈
然後也是可以看到執行了Update語句
管理後臺也是加了個狀態欄
參考資料
- HangfireIO/Hangfire:一種在.NET和.NET Core應用程式中執行後臺作業處理的簡單方法。無需 Windows 服務或單獨的進程 (github.com) https://github.com/HangfireIO/Hangfire