作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个名为 BackgroundWorker
的类,它有一个持续运行的线程。要关闭此线程,名为 stop
的实例变量需要为 true
。
为确保在类使用完毕后释放线程,我添加了 IDisposable
和调用 Dispose()
的终结器。假设 stop = true
确实导致该线程退出,这个 sippet 是否正确?从终结器调用 Dispose
没问题,对吧?
如果 object
继承了 IDisposable
,终结器应该总是调用 Dispose
,对吗?
/// <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);
}
拥有终结器的唯一原因是允许子类扩展和释放非托管资源。如果您没有子类,那么密封您的类并完全放弃终结器。
关于c# - 终结器和处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/151000/
据我所知,不能保证 Object.finalize() 总是被调用。但是如果有重要的非GC资源,并且用户没有意外调用close(),我该如何释放该资源?PS。 .NET中的Object.Finaliz
我是一名优秀的程序员,十分优秀!