终结器和处置

2023-12-02

我有一个名为BackgroundWorker有一个线程不断运行。要关闭该线程,可以使用名为的实例变量stop需要是true.

为了确保在类使用完毕后释放线程,我添加了IDisposable和一个调用的终结器Dispose()。假如说stop = true确实导致该线程退出,这个 sippet 正确吗?调用一下就好了Dispose来自终结器,对吗?

终结器应该总是调用Dispose if the object继承IDisposable, right?

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

~BackgroundWorker()
{
    this.Dispose();
}

首先,一个严重警告。不要像你一样使用终结器。如果你在终结器中进行锁定,你就会给自己带来一些非常糟糕的影响。简而言之,就是不要这样做。现在回到原来的问题。

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);
}

拥有终结器的唯一原因是允许子类扩展和释放非托管资源。如果您没有子类,则密封您的类并完全删除终结器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

终结器和处置 的相关文章

随机推荐