我对一个抽象类进行了如下实现,但是从sonarqube代码分析中得到了警告。
public abstract class BackgroundService : IHostedService, IDisposable
{
private bool _disposedValue;//https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose
private Task _executingTask;
private readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource();
protected abstract Task ExecuteAsync(CancellationToken stoppingToken);
public virtual Task StartAsync(CancellationToken cancellationToken)
{
_executingTask = ExecuteAsync(_stoppingCts.Token);
if (_executingTask.IsCompleted)
{
return _executingTask;
}
return Task.CompletedTask;
}
public virtual async Task StopAsync(CancellationToken cancellationToken)
{
if (_executingTask == null)
{
return;
}
try
{
_stoppingCts.Cancel();
}
finally
{
await Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite, cancellationToken));
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(bool disposing)//todo kamran
{
if (_disposedValue)
{
return;
}
if (disposing)
{
_stoppingCts.Cancel();
}
_disposedValue = true;
}
~BackgroundService()
{
Dispose(false);
}
} 声纳立方体误差
修正了“IDisposable”的实现,以符合dispose模式。
代码气味
在“BackgroundService”上提供“受保护”的“Dispose(Bool)”的过度实现,或者将类型标记为“密封”。
'BackgroundService.Dispose()‘不应该是’虚拟‘或’抽象‘。
'BackgroundService.Dispose()‘也应该调用'Dispose(true)'.
发布于 2022-02-15 08:45:32
您的Dispose()方法不应该是虚拟的:您的Dispose(bool)方法应该是虚拟的:它是一种常见的已知模式,您可以使用bool参数来确定地(通过调用Dispose或using块)或通过终结器(顺便说一句,您还没有在抽象类中实现)来处理非托管引用。
您缺少终结器配置,以使模式完成:
~BackgroundService() {
Dispose(false);
}否则,GC.SuppressFinalize(this)就没有意义了。
https://stackoverflow.com/questions/71123231
复制相似问题