2011-10-19 8 views
12

estoy tratando de utilizar un mutex para proteger el acceso a un poco de hardware de múltiples hilos, pero estoy confundido en cuanto a lo que significa la/el parámetro exitContext hace:¿Qué significa el contexto de salida para WaitHandle.WaitOne?

public virtual bool WaitOne (
    int millisecondsTimeout, 
    bool exitContext 
) 

The docs dicen:

exitContext - true para salir del dominio de sincronización para el contexto antes de la espera (si está en un contexto sincronizado), y volver a adquirirlo después; de lo contrario, falso.

... pero, ¿qué significa eso en realidad y cuáles son las consecuencias de establecerlo ya sea verdadero o falso? Lo configuré por cierto por ahora y el código parece funcionar, pero estoy nervioso de que no entiendo completamente qué es lo que pasa bajo el capó.

Respuesta

5

También explica que further down the page under Remarks:

Notas Al salir del Contexto

El parámetro exitContext no tiene ningún efecto a menos que el método es WaitOne llamada desde el interior de un contexto no predeterminada administrada. Esto puede suceder si su hilo está dentro de una llamada a una instancia de una clase derivada de ContextBoundObject. Incluso si está ejecutando actualmente un método en una clase que no se deriva de ContextBoundObject, como String, puede estar en un contexto no predeterminado si ContextBoundObject está en su pila en el dominio de la aplicación actual.

Cuando el código se ejecuta en un contexto no predeterminada, especificando cierto para exitContext hace que el hilo para salir de la no predeterminada logró contexto (es decir, la transición al contexto predeterminado) antes de ejecutar el método WaitOne. El hilo vuelve al contexto original no predeterminado después de que finaliza la llamada al método WaitOne.

Esto puede ser útil cuando la clase vinculada al contexto tiene SynchronizationAttribute. En ese caso, todas las llamadas a los miembros de la clase se sincronizan automáticamente, y el dominio de sincronización es el cuerpo completo de código para la clase. Si el código en la pila de llamadas de un miembro llama al método WaitOne y especifica true para exitContext, , el hilo sale del dominio de sincronización, permitiendo que un hilo se bloquee en una llamada a cualquier miembro del objeto para proceder. Cuando el método WaitOne retorna, el hilo que realizó la llamada debe esperar a volver a ingresar al dominio de sincronización.

14

La sección de Comentarios de la página de MSDN se lee como por completo engullir, por supuesto. Los contextos de ejecución son un detalle de implementación bien oculto en .NET. Te diré lo que invirtió la ingeniería sin ser capaz de clavarlo por completo. El argumento exitContext es relevante solo en escenarios remotos.Pasando true, permite que se suspenda la llamada actual y que se realice una llamada desde el cliente al servidor. Lo haría para mejorar el rendimiento, seleccionando verdadero solo cuando espera que la llamada WaitOne() tarde un poco. Sin embargo, las implicaciones exactas de hacerlo no son obvias para mí, ni documentadas en ningún lugar que conozca. La sobrecarga de WaitOne() (sin tiempo de espera) siempre pasa falso, lo que pone un poco de tensión en mi explicación, lamentablemente.

Una historia secundaria detrás de este método es que se entiende tan poco que Microsoft decidió romper la compatibilidad con versiones anteriores en .NET 2. Agregaron la sobrecarga WaitOne (int) en el Service Pack 2. Que pasa falso para exitContext argumento. Esto causó mucho caos, los programadores comenzaron a usarlo y luego encontraron que su programa fallaba cuando se ejecutaba en una versión anterior a SP2 de .NET. Ay.

Cuestiones relacionadas