c# - 定期托管服务是否需要保持事件状态?

标签 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;
    }
}

我想确保此任务始终运行。但是托管服务不是 guaranteed to complete由于应用程序池回收等。

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

编辑

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

如果是这种情况,并且没有向我的网站发出任何请求,我是否仍能保证我的 SchedulerService 会运行?

或者我应该让我的调度程序服务每大约 75 秒向我自己发送一个请求,以确保新线程将重新启动调度程序?

最佳答案

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

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

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

此外,为了向前兼容,让您的托管服务继承 BackgroundService类并使用 AddHostedService 将其注册为依赖项注入(inject)。

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

关于c# - 定期托管服务是否需要保持事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53753802/

相关文章:

c# - Json.NET:如何使 DefaultValueHandling 仅适用于某些类型?

c# - 远程登录时如何屏蔽用户输入?

C# 从数据库中的表填充组合框

c# - 如何在 Appium 中为 iOS 自动化启用和使用 WebView

.net - 了解 .Net Core 和 Mono

c# - 从通用数组返回引用

asp.net-core - 用于安装/升级 .NET Core 的命令行

android - 异步任务进度对话框显示太晚

multithreading - 如何让OpenMP线程或任务在某个核心上运行

java - 如何从JavaFX中的二级线程获取更新消息/属性?