我正在做一些多线程并使用AutoResetEvents和ManualResetEvents来控制我的主循环.当"destryoing"线程时,我也必须处理这些信号,这很清楚.
但是我看到了如何处理Waithandles的不同方法,我不确定哪一个是正确的:
版本1
if (disposing)
{
this.threadExitEvent.SafeWaitHandle.Dispose();
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
Run Code Online (Sandbox Code Playgroud)
版本2
if (disposing)
{
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
Run Code Online (Sandbox Code Playgroud)
版本3
if (disposing)
{
this.threadExitEvent.Close();
....
}
Run Code Online (Sandbox Code Playgroud)
版本2是我要使用的,因为(大概)没有必要坚持你的新处置WaitHandle,所以设置它null是一个好主意.这样也可以更容易地使您的对象能够从被处理中恢复,因为您只需要检查是否WaitHandle为null并重新创建它.
话虽这么说,没有人会打你的选择3.
不要使用选项1; "到达对象内部"并开始处置成员通常是一个坏主意.调用Close(因为Dispose方法来自IDisposable显式实现并具有相同的代码Close)自动处理SafeWaitHandle.不要自己这样做.