2015-08-20 6 views
4

Являются ли классы C# ManualResetEvent и AutoResetEvent дорогостоящими для создания или обслуживания?Какие ресурсы потребляет AutoResetEvent/ManualResetEvent?

Они потребляют какие-то ограниченные ресурсы ядра Windows, и если да, то насколько это ограничено?

E.g. если у меня есть код, который может создать новый AutoResetEvent каждые 100 мс (который должен быть удален вскоре после этого), я должен беспокоиться о том, чтобы ставить старые AutoResetEvents в пул и повторно использовать их, или это не является серьезной проблемой?

Поскольку они являются IDisposables, я полагаю, они потребляют какой-то ограниченный ресурс. Сколько они потребляют, и в какой момент я должен начать беспокоиться об использовании слишком многих из них?

Тот факт, что есть ManualResetEventSlim, но не AutoResetEventSlim также меня немного беспокоит.

+0

Я бы посоветовал альтернативный дизайн, который не требует создания всех создаваемых динамических событий. –

+0

Спасибо за совет, это было бы и моим интуитивным пониманием. Почему бы вам посоветовать это? Каковы скрытые затраты на создание этих событий динамически? – HugoRune

+0

Он основан на опыте встроенных систем. Обычно потоки и объекты синхронизации потоков создаются заранее. –

ответ

-1

ManualResetEvent использует Wait Handles тогда ManualResetEventSlim использует Busy Spinning

лучшее исполнение в порядке, является: 1) стандартный замок (монитор) 2) "тонкий" классы событий 3) стандартные классы событий

Учитывая ваше использование я бы рекомендовал использовать «тонкие» классы, так как вы будете ждать только короткого времени. Кроме того, если «тонкий» класс слишком долго ждет, он будет вести себя как «не-тонкий» класс.

Обратите внимание: вы не можете использовать «тонкие» классы для всех процессов.


EDIT: Вот почему AutoResetEvent не имеет «тонкую» версию - в основном это потому, что ожидания времена AutoResetEvent, как правило, больше, чем ManualResetEvent, поэтому он не подходит для использования «занято спиннинг»


EDIT: Обработчик ожидания наследует от MarshalByRefObject. В конечном итоге .NET runtime устанавливает прокси (класс TransparentProxy) для удаленного доступа к вашему дескриптору ожидания.

См. here и here для получения дополнительной информации.


+1

Какие ресурсы использует этот ресурс WaitHandle, который используется AutoResetEvent или ManualResetEvent? Учитывая, что ManualResetEventSlim ведет себя как ManualResetEvent для более длительного времени ожидания, я полагаю, что потребление ресурсов также похоже на время ожидания. – HugoRune