ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务
在大部分程序中一般都會需要用到后臺任務, 比如定時更新緩存或更新某些狀態。
一、應用場景
以調用微信公眾號的Api為例, 經常會用到access_token,官方文檔這樣描述:“是公眾號的全局唯一接口調用憑據,有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的access_token失效,建議公眾號開發者使用中控服務器統一獲取和刷新Access_token,其他業務邏輯服務器所使用的access_token均來自于該中控服務器,不應該各自去刷新,否則容易造成沖突,導致access_token覆蓋而影響業務。”
在這個場景中我們可以創建一個后臺運行的服務,按照access_token的有效期定時執行去請求獲取新的access_token并存儲,其他所有需要用到這個access_token的都到這個共有的access_token。
二、實現方式(一)
ASP.NET Core 在2.0的時候就提供了一個名為IHostedService的接口,我們要做的只有兩件事:
1. 實現它。
2. 將這個接口實現注冊到依賴注入服務中。
A. 實現IHostedService的接口
? ? ? ? ? ? 首先看一下這個IHostedService:
public interface IHostedService{ ? ? ?? ? ? ?Task StartAsync(CancellationToken cancellationToken); ? ?
? ? ? ?Task StopAsync(CancellationToken cancellationToken);}
通過名字就可以看出來,一個是這個服務啟動的時候做的操作,另一個則是停止的時候。
新建一個類?TokenRefreshService??實現?IHostedService?,如下面代碼所示:
既然是定時刷新任務,那么就用了一個timer, 當服務啟動的時候啟動它,由它定時執行Refresh方法來獲取新的Token。
這里為了方便測試寫了5秒執行一次, 實際應用還是讀取配置文件比較好, 結果如下:
BackService.TokenRefreshService:Information: 17:23:30: Refresh Token!BackService.TokenRefreshService:Information: 17:23:35: Refresh Token!BackService.TokenRefreshService:Information: 17:23:40: Refresh Token!BackService.TokenRefreshService:Information: 17:23:45: Refresh Token!BackService.TokenRefreshService:Information: 17:23:50: Refresh Token!?
三、實現方式(二)
?在 ASP.NET Core 2.1中, 提供了一個名為?BackgroundService??的類,它在?Microsoft.Extensions.Hosting?命名空間中,查看一下它的源碼:
可以看出它一樣是繼承自?IHostedService, IDisposable?, 它相對于是幫我們寫好了一些“通用”的邏輯, 而我們只需要繼承它并且實現它的?ExecuteAsync?即可。
也就是說,我們只需在這個方法內寫下這個服務需要做的事即可。?
這樣上面的刷新Token的Service就可以改寫成這樣:
是不是簡單了不少。(同樣這里為了方便測試寫了5秒執行一次)
原文地址:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_11.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core微服务之基于Ident
- 下一篇: 好代码是管出来的——.Net中的代码规范