2010-04-27 17 views
5

Sto facendo un po 'di multi-threading e uso AutoResetEvents e ManualResetEvents controllano il mio ciclo principale. Quando "scaricano" i fili devo anche disporre di questi segnali, è chiaro.Come smaltire correttamente un waithiple

ma ho visto diversi modi come smaltire Waithandles, e non sono sicuro che uno è corretto:

Versione 1

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

Versione 2

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

versione 3

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

risposta

6

La versione 2 è quello con cui andrei, poiché non c'è (presumibilmente) alcuna necessità di aggrapparsi al nuovo WaitHandle, quindi impostarlo su null è una buona idea. Ciò rende anche più semplice adattare il tuo oggetto che è in grado di recuperare dallo smaltimento, poiché tutto ciò che devi fare è controllare se lo WaitHandle è nullo e ricrearlo se è così.

Detto questo, nessuno sta andando a schiaffeggiare la mano per andare con l'opzione 3.

Non utilizzare l'opzione 1; in genere è una cattiva idea quella di "raggiungere" gli oggetti e iniziare a eliminare i membri. Chiamando Close (poiché il metodo Dispose da IDisposable è implementato esplicitamente e ha il codice identico a Close) si occupa automaticamente dello smaltimento di SafeWaitHandle. Non farlo da solo.

+0

+ 1 - Ho completamente trascurato il fatto che Dispose è un'implementazione esplicita dell'interfaccia (grazie, Adam!) - questa è certamente la strada da percorrere. –

+0

Suoni ragionevoli. Ho già intuito che la versione 2 è quella "più pulita". Grazie – TomTom

Problemi correlati