2010-04-27 5 views
5

Ich mache einige Multithreading und AutoResetEvents und ManualResetEvents verwenden, um meine Hauptschleife zu steuern. Bei der "Zerstörung" der Threads muss ich diese Signale auch entsorgen, das ist klar.Wie man ein Waithandle korrekt disponiert

Aber ich sah verschiedene Möglichkeiten, wie waithandles zu entsorgen, und ich bin nicht sicher, welche richtig ist:

Version 1

if (disposing) 
{ 
this.threadExitEvent.SafeWaitHandle.Dispose(); 
this.threadExitEvent.Close(); 
this.threadExitEvent = null; 
.... 
} 

Version 2

if (disposing) 
{ 
this.threadExitEvent.Close(); 
this.threadExitEvent = null; 
.... 
} 

Version 3

if (disposing) 
{ 
this.threadExitEvent.Close(); 
.... 
} 

Antwort

6

Version 2 ist das, womit ich gehen würde, da es (vermutlich) keine Notwendigkeit gibt, an Ihrem neu entsorgten WaitHandle festzuhalten, es ist also eine gute Idee, es auf null zu setzen. Dies macht es auch einfacher, Ihr Objekt so anzupassen, dass es wiederhergestellt werden kann. Sie müssen lediglich überprüfen, ob WaitHandle null ist, und es neu erstellen, falls dies der Fall ist.

aber sagen, dass geht niemand der Hand zu schlagen, um mit Option gehen 3.

nicht Option Verwenden Sie 1; Es ist generell eine schlechte Idee, Objekte zu erreichen und Mitglieder zu entsorgen. Der Aufruf Close (da die Dispose Methode aus IDisposable explizit implementiert ist und identischen Code zu Close hat) sorgt automatisch für die Entsorgung der SafeWaitHandle. Tun Sie das nicht selbst.

+0

+ 1 - Ich habe völlig übersehen, dass Dispose eine explizite Interface-Implementierung ist (Danke, Adam!) - das ist sicher der richtige Weg. –

+0

Klingt vernünftig. Ich habe bereits vermutet, dass Version 2 die "sauberste" Version ist. Vielen Dank – TomTom

Verwandte Themen