如何在IIS中无需控制器操作,让后台服务每次部署后自动启动
问题描述
我已经构建了一个生成Excel报表并上传至云存储服务商的服务,同时创建了每晚午夜运行该服务的定时任务。但我经常会重新部署应用以进行更新,希望实现每次部署后该后台任务自动运行,请问能否自动实现,还是需要创建控制器操作并手动调用以启动任务?
我的代码如下:
public class ReviewSummaryBackgroundService : BackgroundService { protected IReviewSummaryService _reviewSummaryService; public ReviewSummaryBackgroundService(IReviewSummaryService reviewSummaryService) { _reviewSummaryService = reviewSummaryService; } private static int SecondsUntilMidnight() { return (int)(DateTime.Today.AddDays(1.0) - DateTime.Now).TotalSeconds; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { var countdown = SecondsUntilMidnight(); while (!stoppingToken.IsCancellationRequested) { if (countdown-- <= 0) { try { await OnTimerFiredAsync(stoppingToken); } catch(Exception ex) { // in future log exception } finally { countdown = SecondsUntilMidnight(); } } await Task.Delay(1000, stoppingToken); } } private async Task OnTimerFiredAsync(CancellationToken stoppingToken) { await _reviewSummaryService.ExportExcelReportAsync(); } }
解决方案
完全可以实现部署后自动运行,不需要手动调用。你只需要在ExecuteAsync方法启动时,先立即执行一次任务,再进入午夜等待的逻辑即可。
修改后的代码如下:
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 部署启动后立即执行一次任务 try { await OnTimerFiredAsync(stoppingToken); } catch(Exception ex) { // 记录异常 } // 之后继续维持每晚午夜运行的逻辑 var countdown = SecondsUntilMidnight(); while (!stoppingToken.IsCancellationRequested) { if (countdown-- <= 0) { try { await OnTimerFiredAsync(stoppingToken); } catch(Exception ex) { // 记录异常 } finally { countdown = SecondsUntilMidnight(); } } await Task.Delay(1000, stoppingToken); } }
这样修改后,每次应用部署启动时,ReviewSummaryBackgroundService会在初始化后立刻执行一次报表生成任务,之后再按照原逻辑等待到下一个午夜继续执行,完全满足你的需求。
如果担心启动时执行和午夜任务重叠(比如刚好在午夜前后部署),可以根据实际情况处理:如果任务是幂等的(重复执行不会产生问题),直接执行即可;如果需要避免重复,可添加时间判断,比如只在距离午夜超过N分钟时才启动执行。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

