Нужно ли мне Dispose() или Close() EventWaitHandle?
Если я использую EventWaitHandle
(или AutoResetEvent
, ManualResetEvent
) для синхронизации между потоками, тогда мне нужно вызвать методы Close()
или Dispose()
в этом дескрипторе события, когда я закончил с ним?
EventWaitHandle
наследуется от WaitHandle
, который реализует IDisposable
. И FxCop жалуется, если я не реализую IDisposable
для любого класса, содержащего EventWaitHandle
. Поэтому это говорит о том, что мне нужно это назвать.
Однако ни один из этих примеров использования MSDN не вызывает Dispose()
или Close()
:
http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle(VS.80).aspx
http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent(VS.80).aspx
http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(VS.80).aspx
Это просто пример того, как Microsoft игнорирует свои собственные советы?
Ответы
Ответ 1
Ресурс одноразового использования EventWaitHandle
на самом деле равен SafeHandle
(завернутый в SafeWaitHandle
). SafeHandle
реализует финализатор, который в конечном итоге гарантирует, что необходимый ресурс будет выпущен, поэтому должно быть безопасно разрешить обработчик мусора/финализатора в этом случае.
Однако всегда полезно называть Dispose()
явным образом, когда ресурс больше не нужен.
В главе по потоку в С# 3.0 в двух словах говорится
Эта практика (возможно) приемлема с помощью команд ожидания, поскольку они имеют легкая брешь ОС (асинхронная делегаты полагаются именно на этот механизм выпустить их IAsyncResult
wait ручка).
Ответ 2
Вам нужно явно их утилизировать. Close() более подходит для них, так как он вызывает Dispose().
Ответ 3
Определения классов из MSDN:
public class EventWaitHandle : WaitHandle
public abstract class WaitHandle : MarshalByRefObject, IDisposable
Итак, да, так как WaitHandle IDisposable. FxCop обнаружил бы это, как правило, нарушение, если вы этого не сделали.