Frage

Sie scheinen beide den gleichen Zweck zu erfüllen. Wann würde ich einen über den anderen wählen?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top