關於我
做者博客|文章首發程序員
咱們常常要使用NetCore控制檯或者AspNetCore來定義一些通用的後臺服務。若是自行編碼的話,對後臺服務的理解應該體如今啓動一個線程,使用while循環執行任務,每次時間間隔N秒,這是最簡單的一種實現方式。web
既然NetCore如今的穩定版本都已是3.1了,難道官方沒有考慮到這種最基本的使用場景嗎。固然不會,下面咱們就本着參考官方文檔的角度解析一下後臺服務在Core控制檯中的使用。數據庫
初始化準備
首先咱們建立一個控制檯項目,下載基礎包async
nuget install Microsoft.Extensions.Hosting
初始化Program.cs文件工具
public static class Program { static async void Main(string[] args) { var builder = new HostBuilder().ConfigureServices((context, service) => { }); await builder.RunConsoleAsync(); } }
使用詳解
通常後臺服務
開始使用
注入後臺服務很是簡單,調用service.AddHostedService
方法將自定義的服務進行注入。visual-studio
service.AddHostedService<CustomerJob/Service>();
自定義的後臺服務類須要知足定義的接口,才能夠被正常使用,下面我引用一個官方的案例進行說明網站
定時後臺任務使用 [System.Threading.Timer]類。 計時器觸發任務的
DoWork
方法。 在StopAsync
上禁用計時器,並在Dispose
上處置服務容器時處置計時器:ui
繼承IHostedService
接口,實現StartAsync
和StopAsync
方法便可將服務正常注入後臺任務中。編碼
IDisposable
的做用主要是在進程關閉時釋放定時器資源url
public class TimedHostedService : IHostedService, IDisposable { private int executionCount = 0; private readonly ILogger<TimedHostedService> _logger; private Timer _timer; public TimedHostedService(ILogger<TimedHostedService> logger) { _logger = logger; } public Task StartAsync(CancellationToken stoppingToken) { _logger.LogInformation("Timed Hosted Service running."); _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); return Task.CompletedTask; } private void DoWork(object state) { var count = Interlocked.Increment(ref executionCount); _logger.LogInformation( "Timed Hosted Service is working. Count: {Count}", count); } public Task StopAsync(CancellationToken stoppingToken) { _logger.LogInformation("Timed Hosted Service is stopping."); _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() { _timer?.Dispose(); } }
內容整合
將上文中的內容進行一個整合,獲得的效果是
public static class Program { static async void Main(string[] args) { var builder = new HostBuilder().ConfigureServices((context, service) => { service.AddHostedService<TimedHostedService>(); }); await builder.RunConsoleAsync(); } }
Ctrl+F5便可查看執行效果
其餘說明
以上說明的是後臺任務在Core控制檯中的應用,那麼在AspNetCore【Web項目】中是怎麼使用的呢。固然都是同樣的,只是注入的地方發生了小小的改變,在AspNetCore中注入一般發生在StartUp.cs
中的方法ConfigureServices
。使用方法和控制檯一致。
public void ConfigureServices(IServiceCollection services) { service.AddHostedService<TimedHostedService>(); }
帶做用域的服務
適用於Web項目中涉及數據庫等外鏈接操做的場景,例如
每一次web請求對應一個數據庫上下文[DbContext],這個時候就要用要帶做用域的服務。
帶做用域的服務使用也很是簡單,能夠參考官方文檔,這裏我就不作其餘介紹
參考
https://blog.csdn.net/weixin_34174105/article/details/86015664
推薦閱讀
最後
本文到此結束,但願對你有幫助 😃
若是還有什麼疑問或者建議,能夠多多交流,原創文章,文筆有限,才疏學淺,文中如有不正之處,萬望告知。
更多精彩技術文章彙總在個人 公衆號【程序員工具集】,持續更新,歡迎關注訂閱收藏。