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图标索引网站

最后

本文到此结束,但愿对你有帮助 😃

若是还有什么疑问或者建议,能够多多交流,原创文章,文笔有限,才疏学浅,文中如有不正之处,万望告知。

更多精彩技术文章汇总在个人 公众号【程序员工具集】,持续更新,欢迎关注订阅收藏。

相关文章
相关标签/搜索