Pregunta

Estoy tratando de usar un mutex para proteger el acceso a algún hardware de múltiples hilos, pero estoy confundido en cuanto a lo que el exitContext parámetro medios / does:

public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
)

Los documentos decir:

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

... Pero, ¿qué significa eso realmente y cuáles son las consecuencias de establecerlo en verdadero o falso? Lo he establecido en verdad por ahora y el código parece funcionar, ¡pero estoy nervioso de no entiendo completamente lo que está haciendo debajo del capó!

¿Fue útil?

Solución

También explica más abajo en la página en Observaciones que:

Notas sobre la salida del contexto

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

Cuando su código se está ejecutando en un contexto no defectuoso, especificar True para ExitContext hace que el hilo salga del contexto administrado no definido (es decir, la transición al contexto predeterminado) antes de ejecutar el método de WaitOne. El hilo vuelve al contexto original de Nonfault después de que se completa la llamada al método WaitOne.

Esto puede ser útil cuando la clase vinculada al contexto tiene sincronización. En ese caso, todas las llamadas a los miembros de la clase se sincronizan automáticamente, y el dominio de sincronización es todo el cuerpo 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 verdadero para ExitContext, el subproceso sale del dominio de sincronización, lo que permite un hilo que está bloqueado en una llamada a cualquier miembro del objeto para proceder. Cuando regresa el método WaitOne, el hilo que hizo la llamada debe esperar para volver a ingresar el dominio de sincronización.

Otros consejos

La sección Observación de la página MSDN se lee como total GobbledeGook, por supuesto. Los contextos de ejecución son un detalle de implementación bien oculto en .NET. Solo te diré lo que invertí diseñé sin poder clavarlo por completo.

los exitContext El argumento es relevante solo en los escenarios de remota. Al pasar verdadero, usted permite suspender la llamada actual y otra llamada se someterá al cliente al servidor. Lo haría para mejorar el rendimiento, seleccionando True solo cuando espera que la llamada WaitOne () tome un tiempo. Sin embargo, las implicaciones exactas de hacerlo no son obvias para mí, ni documentadas en ningún lugar que conozco. La sobrecarga de WaitOne () (sin tiempo de espera) siempre pasa falso, eso pone un poco de tensión en mi explicación desafortunadamente.

Un historial secundario detrás de este método es que se entiende tan mal que Microsoft decidió romper la compatibilidad con retroceso en .NET 2. Agregaron la sobrecarga WaitOne (int) en el paquete de servicio 2. que pasa falso para el exitContext argumento. Esto causó mucho caos, los programadores comenzaron a usarlo y luego encontraron que su programa fallaron cuando se ejecuta en una versión previa a SP2 de .NET. Ay.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top