Wann sollte ich einen Wartehandle anstelle eines Schloss verwenden?
-
27-10-2019 - |
Frage
Im C#
, wenn wir verwenden sollten WaitHandle
Anstatt von lock
?
Lösung
Ein Schloss unterscheidet sich grundlegend von a WaitHandle
. Mit einem Schloss, das Sie schreiben, zum Beispiel:
lock (SomeResource)
{
// do stuff here
}
In der ersten Zeile heißt es: "Ich möchte einen exklusiven Zugriff auf diese Ressource" und wird warten, bis diese Ressource verfügbar ist (dh niemand sonst hat eine Sperre dafür). Dann wird der Code ausgeführt und am Ende wird das Schloss veröffentlicht, damit andere ihn verwenden können.
WaitHandle
wird verwendet, um auf eine Veranstaltung zu warten. Wenn Sie schreiben:
MyWaitHandle.WaitOne();
Ihr Code wartet auf einen anderen Thread (möglicherweise in einem anderen Prozess), um dies zu signalisieren WaitHandle
. Was es signalisiert, könnte alles sein. Vielleicht warten Sie darauf, dass ein weiterer Thread seinen Job beendet und sagt: "Ich bin jetzt fertig", bevor Ihr Code fortgesetzt wird.
Um Ihre Frage zu beantworten, sollten Sie ein Schloss verwenden, wenn Sie exklusiven Zugriff auf eine Ressource erhalten möchten. Du solltest benutzen WaitHandle
Wenn Sie über ein Ereignis informiert werden möchten.
Andere Tipps
Ein Wartenhandel kann auf mehrere Griffe warten, ein Schloss kann nur auf einen warten.
Wenn du es brauchst. Im Ernst, Lock ist syntaktischer Zucker mit Monitor
, was wahrscheinlich innen Waits verwendet.
Verwenden Sie es nur, wenn Sie mehr Flexibilität benötigen (wie z. B. das Halten an einem Schloss länger als im aktuellen Bereich ...) oder mehrere Sperren in der richtigen Reihenfolge usw. verwalten usw.
Sie erreichen völlig unterschiedliche Dinge. EIN lock
wird verwendet, um den Zugriff auf einen bestimmten Codeblock auf a zu begrenzen Single Faden nach dem anderen. EIN WaitHandle
ist die Basisklasse für mehrere gleichzeitbedingte Klassen, wie z. Semaphore
, Mutex
, AutoResetEvent
, und ManualResetEvent
, die es Ihnen ermöglichen, die Parallelität auf etwas unterschiedliche Weise zu steuern. Zum Beispiel a Semaphore
ermöglicht es Ihnen, die Parallelität auf zu begrenzen nicht mehr als N Themen anstelle eines einzelnen Threads.
WaitHandle
Wird oft verwendet, wenn Sie mehrere Threads laufen lassen und auf eine oder alle abgeschlossen werden möchten, bevor Sie weiterhin andere Aktionen ausführen. lock
würde verwendet, wenn Sie verhindern möchten, dass mehrere Threads gleichzeitig auf eine gemeinsam genutzte Ressource zugreifen.
Die beste Erklärung liegt in diesen beiden Links. Leider müssen Sie etwas lesen, um eine vollständige Antwort auf die Art von Frage zu erhalten, die Sie gestellt haben:
Dies enthält auch ein Beispiel:http://msdn.microsoft.com/en-us/library/system.threading.waitandle.aspx