使用 IHostedService 和 BackgroundService 类在微服务中实现后台任务

https://docs.microsoft.com/zh-cn/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice

 

.NET Core 2.1 中引入了 Host(实现 IHost 的基类)。 基本上,Host 能让用户拥有与 WebHost(依赖项注入、托管服务等)相似的基础结构,但在这种情况下,只需拥有一个简单轻便的进程作为主机,与 MVC、Web API 或 HTTP 服务器功能无关。

因此,可以选择一个专用主机进程或使用 IHost 创建一个来专门处理托管服务,例如仅用于托管 IHostedServices 的微服务,或者也可以选择性地扩展现有的 ASP.NET Core WebHost,例如现有的 ASP.NET Core Web API 或 MVC 应用。

每种方法都有优缺点,具体取决于业务和可伸缩性需求。 重要的是,如果后台任务与 HTTP (IWebHost) 无关,则应使用 IHost

练习 :

StartUp.cs注册

 services.AddSingleton<IHostedService, BGService>();

创建类

public class BGService : BackgroundService
    {
        private CancellationTokenSource cancelSource;
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            
            //while (!stoppingToken.IsCancellationRequested)
            //{
            //    await Task.Delay(1000, stoppingToken).ContinueWith(x =>
            //    {
            //        Console.WriteLine($"{DateTime.Now.ToString()}");
            //    });
            //}

            for (int i = 0; i < 10; i++)
            {
                if (!stoppingToken.IsCancellationRequested)
                {
                    await Task.Delay(1000, stoppingToken).ContinueWith(x =>
                    {
                        Console.WriteLine($"{DateTime.Now.ToShortDateString()}");
                    });
                }
                if (i == 5)
                {
                   await StopAsync(stoppingToken);
                }
            }
        }
        public override Task StartAsync(CancellationToken cancellationToken)
        {
            cancelSource = new CancellationTokenSource();
            Console.WriteLine("开始任务");
            
            return base.StartAsync(cancelSource.Token);
        }
        public override Task StopAsync(CancellationToken cancellationToken)
        {
            cancelSource.Cancel();
            Console.WriteLine("任务结束");
            return base.StopAsync(cancelSource.Token);
        }
    }

 

posted @ 2021-05-26 12:43  lunawzh  阅读(591)  评论(0编辑  收藏  举报