Come fare smaltire un WaitHandle correttamente
-
01-10-2019 - |
Domanda
che sto facendo alcuni multi-threading e sull'uso AutoResetEvents e ManualResetEvents non controllare il mio principale - loop. Quando "destryoing" i fili devo anche disporre questi segnali, che è chiaro.
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;
....
}
La versione 2
if (disposing)
{
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
Versione 3
if (disposing)
{
this.threadExitEvent.Close();
....
}
Soluzione
La versione 2 è quello che mi piacerebbe andare con, in quanto c'è (presumibilmente) non c'è bisogno di appendere al vostro WaitHandle
appena disposti, in modo impostazione a null
è una buona idea. Questo rende anche più facile adattare l'oggetto essere in grado di recuperare da essere disposti, come tutto ciò che dovete fare è controllare per vedere se il WaitHandle
è nullo e ricrearlo in caso affermativo.
Detto questo, nessuno sta andando a schiaffeggiare la mano per andare con l'opzione 3.
Non utilizzare l'opzione 1; è generalmente una cattiva idea di "portata dentro" di oggetti e iniziare membri smaltimento. Chiamando Close
(dato che il metodo Dispose
da IDisposable
è esplicitamente implementato e ha un codice identico a Close
) prende automaticamente la cura dello smaltimento dei SafeWaitHandle
. Non farlo da soli.