2012-06-12 9 views
7

Monitor.Enter y Monitor.Exit están diseñados para ser llamados desde el mismo subproceso. Pero, ¿qué sucede si necesito liberar un bloqueo en un hilo diferente al adquirido?Monitor.Enter y Monitor.Exit en diferentes subprocesos

Por ejemplo: hay recursos compartidos y una operación asincrónica que utiliza este recurso. La operación comienza con BeginOperation y adquiere el bloqueo en el recurso compartido. También existe el método EndOperation que libera el bloqueo. EndOperation normalmente se llama en otro subproceso de una devolución de llamada, por lo que no puedo llamar al Monitor.Exit en el método EndOperation. ¿Cuál es el mejor enfoque en este caso? ¿Verificará el bloqueo con AutoResetEvent en lugar de Monitor? Será una buena solución?

+4

utilizar un "semáforo"? –

+0

@pst ¿Por qué específicamente 'Semaphore' y no' Event'? – eigenein

+0

Ver primitivas de sincronización como [Semaphore, SemaphoreSlim, ReaderWriterLock, ReaderWriterLockSlim, ManualResetEvent, ManualResetEventSlim, AutoResetEvent, CountdownEvent, Interlocked, Mutex etc.] (http://msdn.microsoft.com/en-us/library/system.threading.aspx) –

Respuesta

7

Si puede usar .NET 4.0 puede reemplazarlo con System.Threading.Semaphore que le permite adquirir permisos en un hilo y soltarlos en otro.

La clase de semáforo no impone la identidad del subproceso en las llamadas al WaitOne o Release.

11

La primitiva que está buscando se llama un semaphore que se puede acceder de forma segura en un hilo y salió de otro.

Cuestiones relacionadas