2010-04-27 10 views
5

Estoy haciendo un multi-threading y uso AutoResetEvents y ManualResetEvents controlan mi main-loop. Cuando "destryoing" los hilos también tengo que eliminar estas señales, eso está claro.Cómo deshacerse de un indicador de espera correctamente

pero vi diferentes maneras de cómo desechar Waithandles, y no estoy seguro de cuál es la correcta:

Versión 1

if (disposing) 
{ 
this.threadExitEvent.SafeWaitHandle.Dispose(); 
this.threadExitEvent.Close(); 
this.threadExitEvent = null; 
.... 
} 

Versión 2

if (disposing) 
{ 
this.threadExitEvent.Close(); 
this.threadExitEvent = null; 
.... 
} 

Versión 3

if (disposing) 
{ 
this.threadExitEvent.Close(); 
.... 
} 

Respuesta

6

La versión 2 es lo que iría, ya que (presumiblemente) no hay necesidad de aferrarse a su WaitHandle recién instalado, por lo que establecerlo en null es una buena idea. Esto también hace que sea más fácil adaptar su objeto para que se recupere de su eliminación, ya que todo lo que tiene que hacer es verificar si el WaitHandle es nulo y recrearlo si es así.

Dicho esto, nadie va a abofetear a su lado para ir con la opción 3.

No opción 1 no utiliza; generalmente es una mala idea "alcanzar dentro" de los objetos y comenzar a deshacerse de los miembros. Si se llama al Close (ya que el método Dispose de IDisposable está implementado explícitamente y tiene un código idéntico al Close) se ocupa automáticamente de deshacerse del SafeWaitHandle. No hagas eso tú mismo.

+0

+ 1 - He olvidado por completo el hecho de que Dispose es una implementación de interfaz explícita (¡gracias, Adam!): Este es sin duda el camino a seguir. –

+0

Suena razonable. Ya supuse que la versión 2 es la más "limpia". Gracias – TomTom

Cuestiones relacionadas