¿Cómo, para colocar correctamente un WaitHandle
-
01-10-2019 - |
Pregunta
Estoy haciendo algunas AutoResetEvents y ManualResetEvents multi-threading y el uso no controlar mi principal - bucle. Cuando "destryoing" los hilos también tengo que desechar estas señales, eso está claro.
Pero vi diferentes maneras de cómo desechar Waithandles, y no estoy seguro de cuál es la correcta:
Version 1
if (disposing)
{
this.threadExitEvent.SafeWaitHandle.Dispose();
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
Version 2
if (disposing)
{
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
Version 3
if (disposing)
{
this.threadExitEvent.Close();
....
}
Solución
La versión 2 es lo que me gustaría ir con, ya que hay (probablemente) no hay necesidad de aferrarse a su WaitHandle
recién dispuesto, por lo que establecer a null
es una buena idea. Esto también hace que sea más fácil de adaptar su objeto es capaz de recuperarse de estar dispuesto, como todo lo que tiene que hacer es comprobar para ver si el WaitHandle
es nula y volver a crearlo si es así.
Una vez dicho esto, nadie va a abofetear a su lado para ir con la opción 3.
No utilice la opción 1 no; por lo general es una mala idea "dentro de alcance" de los objetos y empezar a miembros de desecharlas. Llamando Close
(ya que el método de Dispose
IDisposable
está implementado de forma explícita y tiene código idéntico al Close
) se encarga automáticamente de la eliminación de la SafeWaitHandle
. No hacerlo usted mismo.