Внутренне ли CLR порождает поток для ответа на события таймера?
Недавно у нас с Хансом была небольшая дискуссия на эту тему, и мне любопытно, как она действительно реализована.
Посмотрите начальный разговор в комментариях здесь: Таймеры C# естественно многопоточные?
2 ответа
Ну, я провел некоторые исследования... Подробности в моем блоге
Чтобы быть кратким, просто резюме оттуда:
- Что касается SSCLI20, то Ганс был совершенно прав. Там действительно отдельный поток для передачи БТР и таймеров в очереди. Спасибо за вашу настойчивость, кстати. Я получил шанс выкопать что-нибудь интересное:)
- На более новых системах это все еще может быть реализовано без дополнительных потоков. Я просто ошибочно предположил, что это было уже там, когда был написан CLR 2.0. Для получения дополнительной информации см. CreateThreadpoolTimer, SetThreadpoolTimer и CloseThreadpoolTimer.
Глядя на справочный источник.Net 4.0, System.Timers.Timer
кажется, использует System.Threading.Timer
обрабатывать фактические детали реализации. Последний генерирует таймеры, вызывая AddTimerNative
, AddTimerNative
это внутренний звонок.
погуглить AddTimerNative
привести к множеству интересных результатов, включая комментарий Вилли Денойетта, где он заявляет, что он вызывает CreateTimerQueueTimer.
На этой странице указано, что "функции обратного вызова помещаются в очередь в пул потоков".