我正在做一些多线程并使用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();
....
}
答案 0 :(得分:6)
版本2是我要使用的版本,因为(大概)不需要依赖于新部署的WaitHandle
,因此将其设置为null
是一个好主意。这样也可以更容易地使您的对象能够从被处置中恢复,因为您只需要检查WaitHandle
是否为空,然后重新创建它。
话虽这么说,但是没有人会用选项3打你的手。
不要使用选项1; “到达对象内部”并开始处置成员通常是一个坏主意。调用Close
(因为来自Dispose
的{{1}}方法已明确实施,且代码与IDisposable
相同)会自动处理Close
。不要自己这样做。