Как правильно распоряжаться дескриптором ожидания

Я использую многопоточность и использую AutoResetEvents, а ManualResetEvents управляют моим основным циклом. При «уничтожении» потоков я также должен избавиться от этих сигналов, это ясно.

Но я видел разные способы избавления от Waithandles, и я не уверен, какой из них правильный:

Версия 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();
 ....
}

person TomTom    schedule 27.04.2010    source источник


Ответы (1)


Версия 2 — это то, что я бы выбрал, поскольку (предположительно) нет необходимости держаться за недавно утилизированный WaitHandle, поэтому установка его на null — хорошая идея. Это также упрощает адаптацию вашего объекта к возможности восстановления после удаления, поскольку все, что вам нужно сделать, это проверить, является ли WaitHandle нулевым, и воссоздать его, если это так.

При этом никто не ударит вас по руке за вариант 3.

Не используйте вариант 1; как правило, это плохая идея «залезть внутрь» объектов и начать избавляться от членов. Вызов Close (поскольку метод Dispose из IDisposable явно реализован и имеет код, идентичный Close) автоматически удаляет SafeWaitHandle. Не делай этого сам.

person Adam Robinson    schedule 27.04.2010
comment
+ 1 — я совершенно упустил из виду тот факт, что Dispose — это явная реализация интерфейса (спасибо, Адам!) — это, безусловно, правильный путь. - person Jeff Sternal; 27.04.2010
comment
Звучит разумно. Я уже догадался, что версия 2 самая чистая. Спасибо - person TomTom; 27.04.2010