Comment à disposer d'un WaitHandle correctement
-
01-10-2019 - |
Question
Je fais des AutoResetEvents et ManualResetEvents multi-threading et utilisation ne contrôlent ma principale - boucle. Lorsque « destryoing » les fils que je dois aussi disposer de ces signaux, qui est clair.
Mais j'ai vu différentes façons comment se débarrasser Waithandles, et je ne suis pas sûr que l'on est correcte:
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();
....
}
La solution
La version 2 est ce que je vais avec, comme il est (probablement) pas besoin d'accrocher à votre WaitHandle
nouvellement disposé, si la mise à null
est une bonne idée. Cela rend également plus facile d'adapter votre objet étant en mesure de récupérer d'être disposé, comme tout ce que vous devez faire est de vérifier pour voir si le WaitHandle
est nul et recréer le cas échéant.
Cela étant dit, personne ne va gifler votre main pour aller avec l'option 3.
Ne pas utiliser l'option 1; il est généralement une mauvaise idée de « portée à l'intérieur » des objets et commencer membres disposant. Appel Close
(depuis la méthode Dispose
de IDisposable
est explicitement mis en œuvre et a un code identique à Close
) prend automatiquement en charge de l'élimination des SafeWaitHandle
. Ne pas faire vous-même.