2010-02-22 14 views
7

Si tiene algunos bloques de código que le gustaría evitar la ejecución cuando se está saliendo y limpiando el objeto, ¿se podría usar un bloqueo para evitar la ejecución?¿Qué sucede con Monitor.Enter sin un Monitor.Exit correspondiente?

Monitor.TryEnter(cleanupLock, ref acquiredLock); 

TryEnter se podría utilizar para asegurarse de que el código no se ejecuta, y puesto que no espera a que la cerradura no será un punto muerto.

Otro subproceso podría atrapar el bloqueo cuando determina que es hora de apagarlo.

Monitor.Enter(cleanupLock); 

Si el subproceso de limpieza nunca llama

Monitor.Exit(cleanupLock); 

haría esta causa un problema?

Respuesta

8

Sí, no llamar a Monitor.Exit por un exitoso Monitor.TryEnter o Monitor.Enter es una vía rápida a un punto muerto en su aplicación. Es posible que pueda hacer que funcione en un escenario limitado de muy, pero eventualmente el código o escenario cambiará y este hará que vuelva a morderlo. Simplemente no lo hagas.

+0

Ir contra el uso convencional es un buen argumento en contra de este patrón. –

6

El único "problema" será que ningún otro código podrá nunca obtener un bloqueo en la variable cleanupLock.

Esto puede o no ser un problema, sin embargo, es una especie de abuso de Monitor, por lo que evitaría hacer esto. Sería mejor manejar esta situación de una manera más común, OMI.

0

¿Esto causa un problema?

Sí. La cerradura nunca se liberaría.

Source:

El subproceso de llamada debe poseer el bloqueo en el parámetro obj. Si el hilo que llama posee el bloqueo en el objeto especificado, y ha hecho un número igual de Salir y Entrar llamadas para el objeto, entonces se libera el bloqueo. Si el hilo que llama no ha invocado Exit tantas veces como Enter, el bloqueo no se libera.

1

Si se trata de una secuencia de apagado de limpieza, entonces es un poco más o menos bien. Usted corre el riesgo de que alguien se registre en alguna parte, por equivocación, una espera de adquisición de cleanupLock. Puede pasar desapercibido en el código y aparecer en el momento más embarazoso. El resultado sería un hilo que se rehúsa a cerrar, tal vez manteniendo el proceso vivo ad-nauseam. Pero, al final del día, corre el mismo riesgo con cualquier otro método que utilice (por ejemplo, bandera de apagado global).

Cuestiones relacionadas