终结器和配置

cor*_*ore 4 c# dispose idisposable disposable finalizer

我有一个名为BackgroundWorker有一个线程不断运行的类.要关闭此线程,stop需要命名为的实例变量true.

为了确保在使用完类时释放线程,我添加IDisposable了一个调用的终结器Dispose().假设stop = true确实导致此线程退出,这个sippet是否正确?Dispose从终结器调用是对的,对吧?

终结者应该总是调用,Dispose如果object继承IDisposable,对吧?

/// <summary>
/// Force the background thread to exit.
/// </summary>
public void Dispose()
{
    lock (this.locker)
    {
        this.stop = true;
    }
}

~BackgroundWorker()
{
    this.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

ned*_*uod 11

首先,一个严重的警告.不要像你一样使用终结器.如果你在终结器中取得锁定,你就会为自己设置一些非常糟糕的效果.短篇小说是不要做的.现在回到原来的问题.

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

/// <summary>
/// Force the background thread to exit.
/// </summary>
protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        lock (this.locker)
        {
            this.stop = true;
        }
    }
}

~BackgroundWorker()
{
    Dispose(false);
}
Run Code Online (Sandbox Code Playgroud)

拥有终结器的唯一原因是允许子类扩展和释放非托管资源.如果你没有子类,那么密封你的班级并完全放弃终结器.

  • 重新发出"严重警告" - 由于"if(disposing)"检查,他*不会*在终结器中锁定 - 仅在Dispose()中.也就是说,挥发性的bool可能会更好.此代码仅在调用Dispose()时停止worker,这是合理且有效的用法. (3认同)