Si estoy usando EventWaitHandle
(o AutoResetEvent
, ManualResetEvent
) para sincronizar entre subprocesos, entonces ¿necesito llamar a los métodos Close()
o Dispose()
en ese identificador de evento cuando haya terminado con ellos?¿Debo eliminar() o Cerrar() un EventWaitHandle?
EventWaitHandle
hereda de WaitHandle
, que implementa IDisposable
. Y FxCop se queja si no implemento IDisposable
en cualquier clase que contenga un EventWaitHandle
. Entonces esto sugiere que necesito llamarlo.
Sin embargo, ninguno de estos ejemplos de uso de MSDN llaman Dispose()
o Close()
:
http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(VS.80).aspx
Se trata sólo de un ejemplo de Microsoft ignorando su propio consejo?
Argumentaría que dejar que el GC lo recoja es bastante indeseable. Dejar el trabajo al finalizador es solo una mala práctica. Solo hay un finalizador único y hacer que haga más de lo que debería no es bueno. Si el hilo se bloquea, tu aplicación se cuelga. Si se lanza una excepción en el hilo del finalizador, su AppDomain se bloquea. Tener el patrón de disposición adecuado garantiza que se llame a GC.SuppressFinalize(), lo que suprime la finalización de este objeto. Tengo un ejemplo de implementar IDisposable - http://dave-black.blogspot.com/2011/03/how-do-you-properly-implement.html –
Estoy de acuerdo y es por eso que declaro que debe llamar explícitamente a 'Dispose '. –