Asp.Net Core WebApi通过BackgroundService执行后台任务

core 2.0中通过实现IHostedService接口实现后台任务

    public interface IHostedService
    {
        Task StartAsync(CancellationToken cancellationToken);
        Task StopAsync(CancellationToken cancellationToken);
    }

core2.1开始,提供了一个继承IHostedService接口的实现类BackgroundService,我们通过实现抽象类BackgroundService来实现后台任务

   public class MonitorService : BackgroundService
    {
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            var lastExecTime = DateTime.Now;
            var lastHourTime = DateTime.Now;
            var lastZeroTime = DateTime.Now;            

            while (!stoppingToken.IsCancellationRequested)
            {
                // 每分钟循环一次
                await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);

                if ((DateTime.Now - lastExecTime).TotalMinutes > 10)
                {
                    lastExecTime = DateTime.Now;
                    // 执行定时任务
                }

                if (DateTime.Now.Hour > lastHourTime.Hour)
                {
                    lastHourTime = DateTime.Now;
                    // 执行整点任务
                }

                if (DateTime.Now.Date > lastZeroTime.Date)
                {
                    lastZeroTime = DateTime.Now;
                    // 执行每天零点任务
                }
            }
        }
    }

在WebApi的Startup类的ConfigureServices方法中注册后台服务

services.AddHostedService<MonitorService>();

在IIS中部署WebApi时,由于IIS自动回收机制会导致后台服务终止,需要对IIS的应用程序池进行配置,在应用程序池上点击高级设置,将启动模式改为“AlwaysRunning”,将固定时间间隔(分钟)改为0

 

posted @ 2022-04-27 12:18  广阔之海  阅读(1835)  评论(0编辑  收藏  举报