继承BackgroundService和Dispose()

时间:2018-06-06 08:06:56

标签: c# azure idisposable

我正在查看https://www.browserling.com/tools/csv-swap-columns

中的BackgroundService

我要转换为从BackgroundService继承的类已实现IDisposable

由于Dispose(bool disposing)未公开BackgroundService,我无法在我的服务base.Dispose(disposing);中致电Dispose(bool disposing)

是否认为继承自BackgroundService的类在StopAsync中清理(或者在ExecuteAsync中有清理代码)?

2 个答案:

答案 0 :(得分:2)

BackgroundServiceStopAsync

中包含此代码
/// <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
}

答案 1 :(得分:1)

  

IHostedService后台任务执行与应用程序的生命周期(主机或微服务,就此而言)相协调。   您在应用程序启动时注册任务,并且您可以在应用程序关闭时执行一些优雅操作或清理。

应用程序启动时的ExecuteAsync注册任务。默认情况下,取消令牌设置为5秒超时。 这意味着我们的服务预计将在5秒内取消,否则将会更加突然被杀。

  

当应用程序主机正在执行正常关闭时触发。

当您ExecuteAsync关闭时,它将触发StopAsync任务。

你可以在StopAsync中运行优雅的清理操作。如果您没有覆盖从BackgroundService继承的类中的StopAsync,它将在Ba​​ckgroundService中执行StopAsync方法。