2008-10-16 4 views
47

Jestem świadomy, że można zablokować obiekt w języku C# za pomocą blokady, ale czy można zrezygnować z blokady i czekać na coś innego, aby powiadomić Cię, że zmieniono ją tak, jak to możliwe w java z oczekiwaniem i powiadomieniem?C# równoważne oczekiwaniu i powiadomieniu java?

Wydaje mi się, że synchronizacja i blokada w java i C# odpowiednio są synonimiczne.

Odpowiedz

86

Równoważna funkcjonalność (w tym normalne blokowanie) znajduje się w klasie Monitor.

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

Oświadczenie w C# lock jest równoznaczne z wywołaniem Monitor.Enter i Monitor.Exit z odpowiednim try/wreszcie zablokować.

Aby uzyskać więcej informacji, zobacz artykuł my threading tutorial lub Joe Albahari's one.

+0

Z Java API: wait() - powoduje, że bieżący wątek czeka, aż inny wątek wywoła metodę notify() lub metodę notifyAll() dla tego obiektu. Twój tutorial wydaje się mówić, że Monitor.Wait() czeka tylko, gdy inny wątek walczy o blokadę. –

+0

@ebyrob: Gdzie to sugeruje? –

+0

oh przepraszam, to był artykuł MSDN, który pomylił mnie: http://msdn.microsoft.com/en-us/library/system.threading.monitor.wait%28v=vs.71%29.aspx mówi "//Poczekaj, jeśli kolejka jest zajęta, przed wywołaniem: Monitor.Wait (m_smplQueue); " Czytałem obie w tym samym czasie i wpadłem w zakłopotanie, o co chodziło. –

1

Myślę, że Wait Handles może pracować dla ciebie. Sprawdź, czy pomaga this.