Нужно ли Dispose () или Close () EventWaitHandle? - PullRequest
21 голосов
/ 18 марта 2009

Если я использую 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 игнорирует их собственные советы?

Ответы [ 3 ]

23 голосов
/ 24 марта 2009

Доступный ресурс EventWaitHandle на самом деле SafeHandle (завернутый в SafeWaitHandle). SafeHandle реализует финализатор, который в конечном итоге обеспечивает освобождение необходимого ресурса, поэтому безопаснее позволить потоку сборщика / финализатора обработать его в этом случае .

Однако всегда неплохо явно вызывать Dispose(), когда ресурс больше не нужен.

Глава о потоках в C # 3.0 в двух словах состояния

Эта практика (возможно) приемлема с ручками ожидания, потому что у них есть легкая нагрузка на ОС (асинхронный делегаты полагаются именно на этот механизм отпустить их IAsyncResult ожидание ручка).

6 голосов
/ 18 марта 2009

Вы должны избавиться от них явно. Close () больше подходит для них, так как вызывает Dispose ().

2 голосов
/ 18 марта 2009

Определения классов из MSDN:

public class EventWaitHandle : WaitHandle
public abstract class WaitHandle : MarshalByRefObject, IDisposable

Так что да, вы должны, поскольку WaitHandle IDisposable. FxCop сочтет это нарушением правила, если вы этого не сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...