Унаследовать BackgroundService и Dispose () - PullRequest
0 голосов
/ 06 июня 2018

Я смотрю на BackgroundService из Реализация фоновых задач в микросервисах с помощью IHostedService и класса BackgroundService

Класс, который я преобразовываю для наследования от BackgroundService реализовано IDisposable.

Поскольку Dispose(bool disposing) не выставляется BackgroundService, я не могу вызвать base.Dispose(disposing); в моем сервисе Dispose(bool disposing).

Является ли идея, что классы, которые наследуются от BackgroundService очистки в StopAsync (или есть код очистки в ExecuteAsync)?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

BackgroundService содержит этот код в StopAsync

/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// </summary>
/// <param name="cancellationToken">Indicates that the shutdown process should no longer be graceful.</param>
public virtual async Task StopAsync(CancellationToken cancellationToken)
{
  if (this._executingTask == null)
    return;
  try
  {
    this._stoppingCts.Cancel();
  }
  finally
  {
    Task task = await Task.WhenAny(this._executingTask, Task.Delay(-1, cancellationToken));
  }
}

Таким образом, это способ очистки при наследовании от BackgroundService

protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
    // here you register to be notified when stoppingToken is Canceled in BackgroundService
    stoppingToken.Register(ShutDown);

    // start some work

    return Task.CompletedTask;
}

private void ShutDown()
{
    // Cleanup here
}
0 голосов
/ 08 июня 2018

Выполнение фоновой задачи IHostedService согласуется со временем жизни приложения (в этом случае хост или микросервис).Вы регистрируете задачи при запуске приложения, и у вас есть возможность выполнить некоторые изящные действия или выполнить очистку при завершении работы приложения.

ExecuteAsync регистрирует задачи при запуске приложения.По умолчанию токен отмены установлен с 5-секундным таймаутом.Это означает, что наша служба будет отменена в течение 5 секунд, в противном случае она будет более внезапно уничтожена.

Сработает, когда хост приложения выполняет постепенное завершение работы.

Когда выExecuteAsync shutdown это вызовет задачу StopAsync.

И вы можете запустить свои изящные действия по очистке в StopAsync.Если вы не переопределите StopAsync в классе, который наследуется от BackgroundService, он будет выполнять метод StopAsync в BackgroundService.

...