如何正确处理等待句柄

时间:2010-04-27 14:37:29

标签: c# waithandle

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

1 个答案:

答案 0 :(得分:6)

版本2是我要使用的版本,因为(大概)不需要依赖于新部署的WaitHandle,因此将其设置为null是一个好主意。这样也可以更容易地使您的对象能够从被处置中恢复,因为您只需要检查WaitHandle是否为空,然后重新创建它。

话虽这么说,但是没有人会用选项3打你的手。

不要使用选项1; “到达对象内部”并开始处置成员通常是一个坏主意。调用Close(因为来自Dispose的{​​{1}}方法已明确实施,且代码与IDisposable相同)会自动处理Close。不要自己这样做。