当前位置:  开发笔记 > 编程语言 > 正文

终结器和配置

如何解决《终结器和配置》经验,为你挑选了1个好方法。

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

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

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

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

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

nedruod.. 11

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

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

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

~BackgroundWorker()
{
    Dispose(false);
}

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



1> nedruod..:

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

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

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

~BackgroundWorker()
{
    Dispose(false);
}

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


重新发出"严重警告" - 由于"if(disposing)"检查,他*不会*在终结器中锁定 - 仅在Dispose()中.也就是说,挥发性的bool可能会更好.此代码仅在调用Dispose()时停止worker,这是合理且有效的用法.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有