从此
文章
📄文章 #️⃣专题 🌐上网 📺 🛒 📱

ASP.NET Core 框架技术 BackgroundService

🕗2019-09-26

托管服务的用法挺简单,只要编写一个实现了IHostedService接口的实现类即可。
一般情况下我们编写从BackgroundService类继承的类,因为BackgroundService实现了IHostedService接口,
并且帮我们处理了任务的取消等逻辑。
我们只要实现BackgroundService类中定义的抽象方法ExecuteAsync,
在ExecuteAsync方法中编写后台执行的代码即可。BackgroundService类实现了IDisposable接口,
我们可以把任务结束后的清理代码写到Dispose方法中。
托管服务会随着应用程序启动,当然,托管服务是在后台运行的,不会阻塞ASP.NET Core中其他程序的运行。

编写托管服务#

namespace bgServiceTest
{
    public class DemoBgService : BackgroundService
    {
        private ILogger<DemoBgService> logger;

        public DemoBgService(ILogger<DemoBgService> logger)
        {
            this.logger = logger;
        }

        /// <summary>
        /// 任务的代码
        /// </summary>
        /// <param name="stoppingToken"></param>
        /// <returns></returns>
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while(true)
            {
                string randomString = "Abc" + Guid.NewGuid().ToString();
                Console.WriteLine(randomString);
                await Task.Delay(1000);
                logger.LogInformation(randomString);
            }
        }

        /// <summary>
        /// 清理工作
        /// </summary>
        public override void Dispose()
        {
            //清理工作
            //...

            base.Dispose();
        }
    }
}

注册托管服务

services.AddHostedService<DemoBgService>();

托管服务中使用依赖注入注意事项

托管服务是以单例的生命周期注册到依赖注入容器中的。
按照依赖注入容器的要求,长生命周期的服务不能依赖短生命周期的服务,
因此我们可以在托管服务中通过构造方法注入其他生命周期为单例的服务,
但是不能注入生命周期为范围或者瞬态的服务。
我们可以通过构造方法注入IServiceScopeFactory服务,
它可以用来创建IServiceScope对象,
这样我们就可以通过IServiceScope来创建短生命周期的服务了。