为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
月关宝盒 2022-06-12 14:34:02
我创建了一个在 .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;    }}我想确保此任务始终运行。但由于应用程序池回收等原因,不能 保证托管服务完成。我对这个概念有点困惑。我现在的印象是托管服务仅在发出请求后在后台运行,并且一旦应用程序池被回收,后台任务就会被终止(例如,旧版本的 .net 限制为 90 秒)编辑我在我的 API 中对此进行了测试,它似乎在最后一次请求发出数小时后连续运行。注意:我在 IIS Express 中对此进行了测试,因此仍然不能保证行为。如果是这种情况,并且没有向我的站点发出请求,我是否仍然可以保证我的 SchedulerService 将运行?或者我应该让我的调度程序服务每 75 秒向自己发送一个请求,以确保新线程将重新启动调度程序?
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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

  • 为了让您的托管服务自动启动,您需要将应用程序池的启动模式设置为Always Running。有关详细信息,请参阅Rick Strahl

  • 为了让您的托管服务无限期地继续运行,您需要将应用程序池的Idle Time-out设置为0

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

此外,为了向前兼容,让您的托管服务继承BackgroundService该类并使用AddHostedService.


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信