gpt4 book ai didi

c# - 终结器和处置

转载 作者:太空狗 更新时间:2023-10-30 00:01:12 26 4
gpt4 key购买 nike

我有一个名为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com