Требуют ли повторяющиеся размещенные сервисы поддерживать работу?

Я создал размещенный сервис, который выполняет повторяющуюся задачу в.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;
    }
}

Я хотел бы убедиться, что эта задача всегда выполняется. Но хостинг-сервисы НЕ гарантированно завершаются из-за повторных пулов приложений и т. Д.

Я немного запутался в этом понятии. У меня сложилось впечатление, что размещенные службы запускаются в фоновом режиме только после того, как сделан запрос, и после повторного использования пула приложений фоновая задача уничтожается (например, 90-секундный лимит из старой версии.net).

РЕДАКТИРОВАТЬ

Я проверил это в своем API, и он, кажется, работает непрерывно даже спустя часы после того, как были сделаны последние запросы. Примечание. Я проверил это в IIS Express, поэтому поведение не гарантируется.

Если это так, и на мой сайт не поступает никаких запросов, могу ли я по-прежнему быть уверенным, что мой SchedulerService будет работать?

Или мне просто нужно, чтобы моя служба планировщика отправляла мне запрос каждые ~75 секунд, чтобы гарантировать, что новый поток перезапустит планировщик?

0 ответов

Если вы запускаете приложение ASP.NET Core в IIS ( не IIS Express):

  • Чтобы служба, размещенная на хосте, запускалась автоматически, вам нужно установить режим запуска пула приложений на Всегда запущенный. См. Рик Страл для получения дополнительной информации.
  • Чтобы служба, размещенная на хосте, продолжала работать неограниченное время, необходимо установить для параметра Время ожидания простоя пула приложений значение 0.

Если вы запускаете приложение как службу Windows, ничего из этого не требуется.

Кроме того, для прямой совместимости, сделайте, чтобы ваша размещенная служба наследовала BackgroundService Класс и зарегистрировать его для внедрения зависимости, используя AddHostedService,

AFAIK, использование модели внутрипроцессного хостинга IIS в.NET Core 2.2 не влияет на это.

Другие вопросы по тегам