5

我正在做一些多线程并使用 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;
 ....
}

版本 3

if (disposing)
{
 this.threadExitEvent.Close();
 ....
}
4

1 回答 1

6

版本 2 是我要使用的版本,因为(大概)不需要挂在你的新处置的WaitHandle,所以将它设置为null是个好主意。这也使您的对象能够更容易地从被处置中恢复,因为您所要做的就是检查是否WaitHandle为空,如果是则重新创建它。

话虽如此,没有人会因为选择选项 3 而拍你的手。

不要使用选项 1;“进入”对象内部并开始处理成员通常不是一个好主意。调用Close(因为Disposefrom 的方法IDisposable是显式实现的并且具有与 相同的代码Close)会自动处理SafeWaitHandle. 不要自己这样做。

于 2010-04-27T14:52:05.500 回答