Muss ich rufen Sie Close() auf ein ManualResetEvent?
Ich gelesen habe, bis auf .NET Threading und arbeitete einige code, der verwendet ein ManualResetEvent. Ich habe gefunden viele code-Beispiele im internet. Jedoch, wenn Sie die Dokumentation Lesen, für WaitHandle, sah ich Folgendes:
WaitHandle implementiert Entsorgen
Muster. Finden Sie unter Implementieren von Finalize und
Entsorgen Sie Bereinigen nicht verwalteter
Ressourcen.
Keiner der Proben zu fordern scheinen .Close() auf der ManualResetEvent-Objekte, die Sie erstellen, auch die schöne Rekursion und Nebenläufigkeit Artikel aus der pfxteam blog (Bearbeiten - dies hat einen using-block, die ich verpasst hat). Ist das nur Beispiel Aufsicht, oder nicht nötig? Ich bin neugierig, weil ein WaitHandle "kapselt Betriebssystem–spezifische Objekte", so könnte es leicht sein, ein Ressourcen-Leck.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen, wenn ein Objekt implementiert
IDisposable
es für einen Grund, und Sie sollten rufen SieDispose
(oderClose
, wie der Fall sein kann). Im Beispiel ist die Website, die ManualResetEvent ist verpackt in eineusing
Aussage, die "automatisch" handle aufrufenDispose
. In diesem FallClose
ist gleichbedeutend mitDispose
(was wahr ist in den meistenIDisposable
Implementierungen, die eineClose
- Methode).Den code aus dem Beispiel:
erweitert, um
Vor kurzem wurde ich weitergeleitet, ein Auszug aus C# 4.0 in a Nutshell: The Definitive Reference Von Joseph Albahari, Ben Albahari. Auf Seite 834, in Kapitel 21: Threading gibt es einen Abschnitt darüber zu reden.
WaitHandle
keine mehr hatFinalize
Methode, ich glaube nicht, dass das bedeutet, dass Sie undicht ist. Stattdessen ist die Bereinigung behandelt innerhalb einerSafeHandle
auf die eineWaitHandle
enthält einen Verweis.Der Nähe ist, behandelt innen ManualResetEvent ' s Entsorgen, und das nennt der 'mit' - Anweisung.
http://msdn.microsoft.com/en-us/library/yh598w02%28VS.100%29.aspx
Sie werden bemerken, dass der code
verwendet die 'mit' - Schlüsselwort. Dies ruft automatisch die dispose-Methode, wenn Sie fertig sind, auch wenn der code eine Ausnahme auslöst.
Ich habe
ManualResetEvent
eine Menge und glaube nicht, dass ich je benutzt habe, es in einen einzigen Methode-es wird immer ein Instanz-Feld einer Klasse. Daherusing()
oft nicht anwenden.Wenn Sie eine Klasse-Instanz-Feld, das eine Instanz von
ManualResetEvent
, machen Sie Ihre Klasse implementierenIDisposable
und in IhremDispose()
Aufruf der MethodeManualResetEvent.Close()
. Dann in alle Verwendungen der Klasse, die Sie verwenden müssenusing()
oder machen das mit Klasse implementierenIDisposable
und wiederholen und wiederholen...Wenn Sie einen
ManualResetEvent
mit anonymen Methoden, dann ist es offensichtlich sinnvoll. Aber als Sam erwähnt, dass Sie oft weitergegeben werden, um in den Arbeitern, und dann gesetzt und geschlossen.Also ich würde sagen, es hängt vom Kontext ab, wie Sie es verwenden - die MSDN WaitHandle.WaitAll() code-Beispiel ist ein gutes Beispiel, was ich meine.
Hier ist ein Beispiel, basierend auf der MSDN-Beispiels, wie das erstellen der WaitHandles mit einem
using
Anweisung Ausnahme: