早上好! 假设我们有以下类:
class MultithreadOperation : IDisposable
{
private IList<Thread> operationThreads;
public void StartOperation()
{
// Initialize and start threads and put them to operationThreads
}
public void StopOperation()
{
// Aborts each thread.
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
disposed = true;
if (disposing)
{
// Release managed resources.
#1:
StopOperation();
}
// Release unmanaged resources.
#2:
StopOperation();
}
}
~MultithreadOperation()
{
Dispose(false);
}
}
实际上,如果实例被释放,我需要停止所有线程。此外,如果实例被垃圾收集,我需要停止所有线程(否则,线程将仍然存在,这对我不利)。 当然,在#1 位置调用 StopOperation() 方法是完全合法的。
我想知道如果我们在 #2 位置调用 StopOperation() 是否有任何陷阱? 据我了解,当 ~MultithreadOperation() 正在执行时,线程列表可能已经被垃圾收集。此外,我看到很多建议避免在 Finalize 实现中引用托管资源的任何代码,尤其是实例字段。
此外,听到有关解决此问题的不同方法会很有趣。 谢谢!
最佳答案
这完全不合适。不太了解细节的类用户会认为调用 Dispose() 会做一些无辜的事情。一点点清理,没什么特别的。她将不期望程序处于完全不可预测的状态,线程改变该状态会在随机位置中止而无法恢复状态。
它也是终结器线程上的完整 redrum,如果线程未处于可警报状态,则中止线程可能需要很多秒。 CLR 将在 2 秒后中止终结器线程并终止程序,完全不诊断程序崩溃的真正原因。
关于c# - 持有线程的类的 IDisposable 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3812651/