如何正确处理 Waithandle

6

我正在进行一些多线程操作,并使用AutoResetEvents和ManualResetEvents来控制我的主循环。当“销毁”线程时,我也必须处理这些信号,这很清楚。

但是我看到了不同的处理Waithandles的方法,我不确定哪个是正确的:

版本1

if (disposing)
{
 this.threadExitEvent.SafeWaitHandle.Dispose();
 this.threadExitEvent.Close();
 this.threadExitEvent = null;
 ....
}

版本2

if (disposing)
{
 this.threadExitEvent.Close();
 this.threadExitEvent = null;
 ....
}

第三版

if (disposing)
{
 this.threadExitEvent.Close();
 ....
}
1个回答

6

我会选择版本2,因为(假定)无需保留您新处理的WaitHandle,所以将其设置为null是个好主意。这也使得更容易调整你的对象以恢复已被处置,只需要检查WaitHandle是否为空,如果是,则重新创建它。

尽管如此,选择选项3也不会有人责备你。

不要使用选项1;“伸手进入”对象并开始处置成员通常是一个坏主意。调用Close(因为从IDisposable继承的Dispose方法已经明确实现并且与Close具有相同的代码),会自动处理SafeWaitHandle的处置。不要自己处理这个问题。


+1 - 我完全忽略了Dispose是一个显式接口实现(谢谢,Adam!)- 这肯定是正确的方法。 - Jeff Sternal
听起来很合理。我已经猜到版本2是最“干净”的了。谢谢。 - TomTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接