Wann würde ich verwenden Autoreset und Manual statt Monitor.Wait () / Monitor.Pulse ()?
-
03-07-2019 - |
Frage
Sie scheinen beide den gleichen Zweck zu erfüllen. Wann würde ich einen über den anderen wählen?
Lösung
die Ereignisse verwenden, wenn Sie einen Thread haben, die auf einem oder alles eine Reihe von Veranstaltungen warten, etwas zu tun.
Mit dem Monitor, wenn Sie den Zugriff auf eine Datenstruktur beschränken wollen durch eine Begrenzung, wie viele Threads darauf zugreifen kann.
Monitore schützen in der Regel eine Ressource, während Ereignisse erzählen Sie etwas geschieht, wie die Anwendung heruntergefahren.
Außerdem können Ereignisse (siehe OpenExisting Methode) genannt werden, dies ermöglicht es ihnen, für die Synchronisation zwischen verschiedenen Prozessen verwendet werden.
Andere Tipps
Meiner Meinung nach ist es besser, Monitor zu verwenden, wenn Sie können, Monitor.Wait und Monitor.Pulse / PulseAll verwendet werden, zwischen Threads für die Signalisierung (wie Manuell / Autoreset) sind jedoch Bildschirm ist schneller, und verwenden Sie keinen nativen Systemressource. Der Monitor offenbar auch im User-Modus implementiert und verwaltet wird, während Manuell / AutoResetEvents erfordern die Umstellung auf Kernel-Modus und p / aufrufen, um einheimische win32 Anrufe, die eine Warte Griff verwenden.
Es gibt Situationen, in denen Sie benötigen, zum Beispiel Manuell / Autoreset, verwenden, zwischen den Prozessen zu signalisieren, können Sie benannte Ereignisse verwenden, und ich denke, native Threads in Ihrer Anwendung zu signalisieren.
Ich bin regurgitating genau das, was ich in diesem ausgezeichneten Artikel gelesen über Threading.
Der ganze Artikel ist lesenswert, aber der Link gelangen Sie auf die Wartegriffabschnitt, der die Ereignisse Details und Warte / Puls überwachen.
Sie würden eine WaitHandle
verwenden, wenn Sie einen Thread wollen ein binäres Signal ohne die Notwendigkeit für einen kritischen Abschnitt senden oder zu empfangen. Monitor.Wait
und Monitor.Pulse
auf der anderen Seite erfordert einen kritischen Abschnitt. Wie die meisten der Synchronisationsmechanismen in der BCL gibt es einige Überschneidungen, wie eine der beiden genannten Sie verwendet werden können. Aber glaube nicht, für einen Moment, dass sie den gleichen Zweck erfüllen.
Monitor.Wait
und Monitor.Pulse
sind ein viel primitiver Synchronisationsmechanismus als ein MRE oder ARE. In der Tat kann man tatsächlich ein MRE oder verwendet nichts anderes als die Monitor
Klasse bauen. Das wichtigste Konzept zu verstehen, wie die Monitor.Wait
und WaitHandle.WaitOne
Methoden unterscheiden. Wait
und WaitOne
werden sowohl das Gewinde im WaitSleepJoin
Zustand versetzt, was bedeutet, der Faden wird im Leerlauf und reagieren nur entweder auf einem Thread.Interrupt
oder den jeweiligen Pulse
oder Set
Anruf. Aber, und das ist ein großer Unterschied, wird Wait
einen kritischen Abschnitt verlassen und reacquire es in einer atomaren Weise . WaitOne
einfach kann dies nicht tun. Es ist ein Unterschied so grundlegender Bedeutung für die Art, wie diese Synchronisationsmechanismen zu verhalten, dass die Szenarien definiert, in denen sie verwendet werden können.
In den meisten Fällen Sie ein MRE wählen würde oder SIND. Diese erfüllen die meisten Situationen, in denen ein Thread ein Signal von einem anderen empfangen muss. Allerdings, wenn Sie möchten, dass Ihr eigenen Signalmechanismus schaffen, dann müßten Sie Wait
und Pulse
verwenden. Aber wieder hat die .NET BCL den meisten gängigen Signalmechanismen bereits abgedeckt. Folgende Signalmechanismen bereits existieren 1 .
- Manual (oder ManualResetEventSlim)
- Autoreset
- Semaphore (oder SemaphoreSlim)
- Eventwaithandle
- CountdownEvent
- Barrier
1 Eine lobende Erwähnung geht an die BlockingCollection
Klasse. Es ist kein Signalmechanismen per se, aber es hat die Eigenschaften eines Signalmechanismus mit dem zusätzlichen Vorteil, dass Sie Daten auf das Signal anhängen. In diesem Fall bedeutet das Signal, dass ein Element in der Sammlung vorhanden ist und die mit diesem Signal zugeordneten Daten sind das Element selbst.
Dieses Tutorial hat detaillierte Beschreibungen von dem, was Sie wissen müssen: http://www.albahari.com/threading/
Insbesondere dies die XXXResetEvent Klassen abdecken,
http://www.albahari.com/threading/part2.aspx
und dies deckt Wait / Puls: http://www.albahari.com/threading/part4.aspx#_Wait_and_Pulse