Тайм-ауты .Net: WaitForSingleObject против таймера - PullRequest
9 голосов
/ 08 октября 2009

Я реализую тайм-аут для асинхронной операции (серии сетевых операций ввода-вывода), и я не уверен, какая из них лучше (с точки зрения распределения / производительности): создание EventWaitHandle и использование RegisterWaitForSingleObject или просто создание таймера и использование его тика.

В моем конкретном случае EventWaitHandle создается лениво, но, очевидно, его необходимо создать для использования WaitForSingleObject. Так что на самом деле это вопрос о стоимости ресурсов WaitHandle + WaitForSingleObject против Timer. Оба подхода так же просты в реализации.

Я реализовал оба в разное время, поэтому я понимаю ландшафт, я просто не уверен, какой подход «лучше».

Ответы [ 2 ]

4 голосов
/ 06 марта 2011

Морган Скиннер из Microsoft , похоже, предпочитает RegisterWaitForSingleObject .

Что касается распределения, рефлектор обнаруживает, что RegisterWaitForSingleObject создает экземпляр RegisteredWaitHandle, а таймер создает внутренний TimerBase, а также класс с именем _TimerCallback. Можно пойти дальше и сравнить размеры этих классов и т. Д., Но они, похоже, имеют больше зависимостей, особенно неуправляемых (обе используют базовые функции win32) - поэтому я действительно не могу дать прямой ответ.

Что касается дескриптора ожидания, переданного RegisterWaitForSingleObject, имейте в виду, что вы можете выделить один Maunal / AutoResetEvent и передать его всем вызовам (так как вы рассчитываете на тайм-аут, так что вы никогда не будете сигнализировать об этом ).

Что касается производительности, я тоже не уверен. ThreadPool будет использовать специальный ожидающий поток для каждых 63 действий, зарегистрированных через RegisterWaitForSingleObject. Напротив, таймер будет использовать базовый таймер win32. Оба будут использовать рабочий поток ThreadPool для фактического выполнения. Что лучше в каких сценариях? Бьет меня .. так что я бы пошел со Скиннером на этот:)

Также см .:

1 голос
/ 08 октября 2009

Нет лучше. Таймер используется, чтобы периодически «тыкать» ваш поток, чтобы сделать что-то. WaitForSingleObject ждет на ручках. Время ожидания истекло, поэтому вы можете использовать его, чтобы решить прекратить ждать, а не застрять в тупике Использование таймера для выхода из одного объекта ожидания из блокировки не требуется, если вы используете тайм-аут.

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

...