定期托管服务是否需要保持活动状态?

时间:2018-12-13 01:31:49

标签: c# .net-core task asp.net-core-hosted-services

我创建了一个托管服务,该服务执行.Net-Core中的重复任务。 (我正在使用共享主机,所以我无法控制iis)

public class SchedulerService : IHostedService
{
    private readonly ILogger _logger;
    private Timer _timer;

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

    public Task StartAsync(CancellationToken cancellationToken)
    {
        this._timer = new Timer(ExecuteTask, null, TimeSpan.Zero,
            TimeSpan.FromMinutes(30));

        return Task.CompletedTask;
    }

    private void ExecuteTask(object state)
    {
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        this._timer?.Change(Timeout.Infinite, 0);
        return Task.CompletedTask;
    }
}

我想确保此任务始终运行。但是由于应用程序池回收等原因,托管服务的不是 unicodata documentation

我对这个概念有些困惑。现在,我的印象是,托管服务仅在发出请求后在后台运行,并且一旦应用程序池被回收,后台任务就会被杀死(例如,旧版.net的限制为90秒)

编辑

我在API中对此进行了测试,它甚至在发出最后一个请求后的数小时内仍连续运行。注意:我在IIS Express中对此进行了测试,因此仍然不能保证行为。

如果是这种情况,并且未向我的网站提出任何请求,是否仍可以保证我的SchedulerService将运行?

还是应该让我的调度程序服务每75秒向自己发送一次请求,以确保有新的线程重新启动调度程序?

1 个答案:

答案 0 :(得分:2)

如果您在IIS(not IIS Express)中运行ASP.NET Core应用程序:

  • 要使托管服务自动启动,您需要将应用程序池的启动模式设置为始终运行。有关更多信息,请参见Rick Strahl
  • 要使托管服务无限期运行,您需要将应用程序池的空闲超时设置为 0

如果将应用程序作为Windows服务运行,则不需要这些。

此外,为了向前兼容,使您的托管服务继承BackgroundService类,并使用AddHostedService注册它以进行依赖项注入。

AFAIK,使用IIS in-process hosting model in .NET Core 2.2对此没有影响。