Как правильно утилизировать ватандль
-
01-10-2019 - |
Вопрос
Я делаю несколько многопоточных и использования AutoResetevents и ManualResetevents, управляют моим основным циклом. Когда «Destryoing» нити я также должен распоряжаться этим сигналами, это ясно.
Но я видел разные способы распоряжаться уходу, и я не уверен, какой из них правильный:
Версия 1.
if (disposing)
{
this.threadExitEvent.SafeWaitHandle.Dispose();
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
Версия 2.
if (disposing)
{
this.threadExitEvent.Close();
this.threadExitEvent = null;
....
}
Версия 3.
if (disposing)
{
this.threadExitEvent.Close();
....
}
Решение
Версия 2 - это то, с чем я пошел, так как есть (предположительно) не нужно держаться на ваших новостях WaitHandle
, так что установить его null
это хорошая идея. Это также облегчает адаптацию вашего объекта, способный к тому, чтобы оправиться, как все, что вам нужно сделать, это проверьте, если WaitHandle
это нулевой и воссоздает его, если так.
Это сказано, никто не собирается поймать вашу руку за то, чтобы идти с вариантом 3.
Не используйте вариант 1; Как правило, плохая идея «достичь внутренней» объектов и начать распоряжаться членами. Призыв Close
(поскольку то Dispose
метод от IDisposable
явно реализован и имеет идентичный код для Close
) автоматически заботится о утилизации SafeWaitHandle
. Отказ Не делай этого самостоятельно.