You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:12:34