如何正确处理等待句柄

Tom*_*Tom 5 c# waithandle

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

Ada*_*son 6

版本2是我要使用的,因为(大概)没有必要坚持你的新处置WaitHandle,所以设置它null是一个好主意.这样也可以更容易地使您的对象能够从被处理中恢复,因为您只需要检查是否WaitHandle为null并重新创建它.

话虽这么说,没有人会打你的选择3.

不要使用选项1; "到达对象内部"并开始处置成员通常是一个坏主意.调用Close(因为Dispose方法来自IDisposable显式实现并具有相同的代码Close)自动处理SafeWaitHandle.不要自己这样做.