NetCore如何使用託管服務執行後臺任務

關於我

做者博客|文章首發程序員

咱們常常要使用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接口,實現StartAsyncStopAsync方法便可將服務正常注入後臺任務中。編碼

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://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0&tabs=visual-studio

https://blog.csdn.net/weixin_34174105/article/details/86015664

推薦閱讀

Redis工具收費後新的開源已出現

GitHub上Star最高的工程師技能圖譜

中國程序員最容易發錯的單詞

推薦!!! Markdown圖標索引網站

最後

本文到此結束,但願對你有幫助 😃

若是還有什麼疑問或者建議,能夠多多交流,原創文章,文筆有限,才疏學淺,文中如有不正之處,萬望告知。

更多精彩技術文章彙總在個人 公衆號【程序員工具集】,持續更新,歡迎關注訂閱收藏。

相關文章
相關標籤/搜索