Если я использую EventWaitHandle
(или AutoResetEvent
, ManualResetEvent
), чтобы синхронизировать между потоками, тогда мне нужно вызвать методы Close()
или Dispose()
этого дескриптора события, когда я закончил с ним?Нужно ли мне Dispose() или Close() EventWaitHandle?
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 игнорируя свои собственные советы?
Я бы сказал, что дать GC собрать это совершенно нежелательно. Выход из работы в поток Finalizer - это просто плохая практика. Существует только один поток финализатора и заставляет его делать больше, чем это действительно должно быть плохо. Если поток заблокирован, ваше приложение зависает. Если в поток финализатора выбрано исключение, ваш AppDomain выйдет из строя. Наличие правильной схемы размещения гарантирует, что GC.SuppressFinalize() вызывается, таким образом, подавляя завершение этого объекта. У меня есть пример реализации IDisposable - http://dave-black.blogspot.com/2011/03/how-do-you-properly-implement.html –
Я согласен, и именно поэтому я заявляю, что вы должны явно называть 'Dispose '. –