Подтвердить что ты не робот

Нужно ли мне 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 игнорирует свои собственные советы?

4b9b3361

Ответ 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 обнаружил бы это, как правило, нарушение, если вы этого не сделали.