Безопасно ли Dispose () EventWaitHandle после того, как ему было сообщено? - PullRequest
3 голосов
/ 15 марта 2011

У меня есть ситуация, когда я создаю несколько IDisposable объектов, каждый из которых инкапсулирует экземпляр EventWaitHandle, так что различные заинтересованные части моего приложения могут ожидать их. Этот экземпляр не доступен напрямую ни для какого кода за пределами объекта-владельца. Доступ к нему возможен только косвенно через вызовы-оболочки.

Как только объект сообщает о своем завершении, он больше не используется, поэтому он удаляется объектом центрального менеджера и отбрасывается из списка ссылок.

Вопрос теперь в том, что делать с инкапсулированным EventWaitHandle? Естественно, он также должен быть удален, и скорее раньше, чем позже, чтобы предотвратить утечку дескрипторами ОС моего приложения.

Но безопасно ли делать это синхронно, сразу после того, как событие было передано объектом-владельцем? Что может произойти, если есть потоки, все еще ожидающие освобождения (т. Е. Блокирование внутри вызова WaitOne())?

Какой рекомендуемый подход здесь?

1 Ответ

1 голос
/ 15 июня 2011

Полагаю, пришло время закрыть это своими собственными результатами.

Я не смог найти каких-либо прямых указаний в документах, но решил следовать информации, которую я извлек из блога Рэймонда Чена.В своих сообщениях (я забыл точные ссылки) он упоминает, что правила Win32 API предписывают, что дескриптор события должен оставаться действительным в течение всего времени ожидания.В неуправляемом мире это означает, что по крайней мере один дескриптор события должен оставаться открытым.

AFAIU, реализация .NET использует Win32 API под капотом, причем каждый экземпляр EventWaitHandle соответствует отдельному неуправляемому событию.Когда EventWaitHandle.Dispose () закрывает единственный дескриптор базового неуправляемого события, это фактически делает экземпляр события недействительным.

Короче говоря, кажется, что правильным подходом является создание параллельной инфраструктуры, через которую издатель событий может уведомитьПотенциальные слушатели этого события скоро уйдут.Затем издатель должен подождать, пока все слушатели не «отписались» (то есть перестали ждать), прежде чем приступить к Dispose () экземпляру события.

Это большая бухгалтерия, но, в конечном счете, это только кажется правильным.Надеюсь, это поможет прояснить ситуацию и другим.

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