首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用抽象类实现i一次性模式的问题是什么?

使用抽象类实现i一次性模式的问题是什么?
EN

Stack Overflow用户
提问于 2022-02-15 08:30:49
回答 1查看 169关注 0票数 0

我对一个抽象类进行了如下实现,但是从sonarqube代码分析中得到了警告。

代码语言:javascript
复制
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)'.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-15 08:45:32

您的Dispose()方法不应该是虚拟的:您的Dispose(bool)方法应该是虚拟的:它是一种常见的已知模式,您可以使用bool参数来确定地(通过调用Disposeusing块)或通过终结器(顺便说一句,您还没有在抽象类中实现)来处理非托管引用。

您缺少终结器配置,以使模式完成:

代码语言:javascript
复制
~BackgroundService() {
   Dispose(false);
}

否则,GC.SuppressFinalize(this)就没有意义了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71123231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档