我正在查看https://www.browserling.com/tools/csv-swap-columns
中的BackgroundService
我要转换为从BackgroundService
继承的类已实现IDisposable
。
由于Dispose(bool disposing)
未公开BackgroundService
,我无法在我的服务base.Dispose(disposing);
中致电Dispose(bool disposing)
。
是否认为继承自BackgroundService
的类在StopAsync
中清理(或者在ExecuteAsync
中有清理代码)?
答案 0 :(得分:2)
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
}
答案 1 :(得分:1)
IHostedService
后台任务执行与应用程序的生命周期(主机或微服务,就此而言)相协调。 您在应用程序启动时注册任务,并且您可以在应用程序关闭时执行一些优雅操作或清理。
应用程序启动时的ExecuteAsync
注册任务。默认情况下,取消令牌设置为5秒超时。
这意味着我们的服务预计将在5秒内取消,否则将会更加突然被杀。
当应用程序主机正在执行正常关闭时触发。
当您ExecuteAsync
关闭时,它将触发StopAsync
任务。
你可以在StopAsync中运行优雅的清理操作。如果您没有覆盖从BackgroundService继承的类中的StopAsync,它将在BackgroundService中执行StopAsync方法。