2011-08-18 14 views
10

Estoy trabajando en 2 servicios de Windows que tienen una base de datos común que quiero bloquear (proceso cruzado) con un sistema Mutex.¿Debo eliminar un Mutex?

Ahora me pregunto si está bien para simplemente llamar WaitOne() y ReleaseMutex() en un bloque try-finally o debería también disponer el objeto mutex (por ejemplo, en un bloque using). Si es así, creo que siempre debería tomar el AbandonedMutexException en el método WaitOne() o ¿me equivoco aquí?

+0

Necesita la excepción AbandonedMutexException para informarle que el servicio que posee el mutex ha finalizado inesperadamente. En ese caso, * tiene * que dejar de usar el dbase y esperar a que el otro servicio se inicie nuevamente.Usar un tercer proceso para actuar como el árbitro sería sabio. –

Respuesta

12

Un mutex es un objeto de núcleo de Windows (aquí envuelto en un objeto .NET).

Como tal, es un recurso no administrado que debe eliminarse.

Más exactamente, el objeto .NET contiene una MANIJA para el mutex, que debe ser liberado/desechado de alguna manera.

No confío en que code sample in the Mutex class docs donde el objeto mutex no está eliminado. Aunque Henzi tiene un buen punto al comentar: el objeto Mutex es estático y el finalizador lo eliminará o lo destruirá el núcleo de Windows cuando el proceso finalice.

Además, tenga en cuenta que Close() dispone el objeto también.

Por supuesto, no hay nada de malo en mantener un objeto Mutex existente en su aplicación aunque no lo use. Son recursos livianos.

+0

No hay muestra de código restante, debe vincularlo: http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –

+1

hecho. La próxima vez, siéntete libre de editar mi respuesta ;-) –

+0

Pero dado que estoy creando servicios de Windows, creo que no debería molestarme en tirar durante el "tiempo de ejecución" de mis servicios (que siempre es así). La creación de una nueva instancia de Mutex con el mismo nombre siempre simplemente envolvería la misma instancia no administrada, ¿verdad? ¿O creará nuevos recursos no administrados una y otra vez? Podría cerrar el mutex cuando uno de mis servicios se detiene para realmente limpiarlo, ¿no es así? – Koen

2

Debe disponer de los recursos que utiliza el indicador de espera.

De la documentación:

Libera todos los recursos utilizados por la instancia actual de la clase WaitHandle . (Se hereda de WaitHandle).

waithandle utiliza recursos no administrados que deberían eliminarse al final del uso.

MSDN Documentation Mutex

6

De acuerdo con this, un nombre Mutex se destruye automáticamente cuando termina el último proceso que contiene un HANDLE de ese Mutex.

En cuanto a los no gestionados MSDN dice

utilizar la función CloseHandle para cerrar el mango. El sistema cierra el identificador automáticamente cuando finaliza el proceso. El objeto mutex se destruye cuando se cerró su último identificador.

En .NET debe llamar .Close() en el Mutex - Esto libera el HANDLE ... ya que cada proceso tiene su propia HANDLE al acceder incluso el mismo nombre Mutex esto es una práctica constante ... no llamar Close() won' No deje ningún problema una vez que el proceso haya terminado (finalizadores y todo) ...