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