2010-04-27 78 views
5

我正在做一些多线程并使用AutoResetEvents和ManualResetEvents来控制我的主循环。当“destryoing”线程时,我也必须处理这些信号,这很明显。如何正确部署等待句柄

但我看到了不同的方式如何处置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(); 
.... 
} 

回答

6

版本2是我想要的,因为(可能)不需要挂在新处理的WaitHandle上,所以将其设置为null是个不错的主意。这也使得更容易适应你的对象能够从被释放中恢复,因为你所要做的就是检查WaitHandle是否为空,如果是,则重新创建它。

话虽这么说,没有人愿意拍你的手与选项去3.

不要使用选项1; “进入”物体并开始处理成员通常是一个糟糕的主意。调用Close(因为IDisposableDispose方法明确实施并且具有与Close相同的代码)自动处理SafeWaitHandle的处置。不要自己这样做。

+0

+ 1 - 我完全忽略了Dispose是一个明确的接口实现的事实(谢谢Adam!) - 这当然是要走的路。 – 2010-04-27 15:33:38

+0

听起来合理。我已经猜到第2版是“最干净”的一个。谢谢 – TomTom 2010-04-27 15:39:16