2008-10-16 12 views
47

Soy consciente de que puedes bloquear un objeto en C# usando el bloqueo, pero ¿puedes abandonar el bloqueo y esperar que algo más te notifique que ha cambiado como puedes en Java con wait and notify?C# equivalente a esperar y notificar de Java?

Me parece que los sincronizados y los bloqueos en java y C# respectivamente son sinónimos.

Respuesta

86

La funcionalidad equivalente (incluido el bloqueo normal) está en la clase Monitor.

foo.notify() => Monitor.Pulse(foo) 
foo.notifyAll() => Monitor.PulseAll(foo) 
foo.wait() => Monitor.Wait(foo) 

La declaración lock en C# es equivalente a llamar Monitor.Enter y Monitor.Exit con un intento apropiado/bloque finally.

Consulte my threading tutorial o Joe Albahari's one para obtener más información.

+0

Desde Java API: wait() - Hace que el hilo actual espere hasta que otro hilo invoca el método notify() o el método notifyAll() para este objeto. Su tutorial parece decir que Monitor.Wait() solo espera si hay otro hilo que compite por un bloqueo. –

+0

@ebyrob: ¿Dónde sugiere eso? –

+0

oh, lo siento, fue el artículo de MSDN el que me confundió: http://msdn.microsoft.com/en-us/library/system.threading.monitor.wait%28v=vs.71%29.aspx dice "//Espera, si la cola está ocupada. Antes de llamar: Monitor.Wait (m_smplQueue); " Estaba leyendo los dos al mismo tiempo y me confundí sobre cuál es cuál. –

1

Creo que Wait Handles puede funcionar para usted. Ver si this ayuda.