Внутренне ли CLR порождает поток для ответа на события таймера?

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

Посмотрите начальный разговор в комментариях здесь: Таймеры C# естественно многопоточные?

2 ответа

Решение

Ну, я провел некоторые исследования... Подробности в моем блоге

Чтобы быть кратким, просто резюме оттуда:

  • Что касается SSCLI20, то Ганс был совершенно прав. Там действительно отдельный поток для передачи БТР и таймеров в очереди. Спасибо за вашу настойчивость, кстати. Я получил шанс выкопать что-нибудь интересное:)
  • На более новых системах это все еще может быть реализовано без дополнительных потоков. Я просто ошибочно предположил, что это было уже там, когда был написан CLR 2.0. Для получения дополнительной информации см. CreateThreadpoolTimer, SetThreadpoolTimer и CloseThreadpoolTimer.

Глядя на справочный источник.Net 4.0, System.Timers.Timer кажется, использует System.Threading.Timer обрабатывать фактические детали реализации. Последний генерирует таймеры, вызывая AddTimerNative, AddTimerNative это внутренний звонок.

погуглить AddTimerNative привести к множеству интересных результатов, включая комментарий Вилли Денойетта, где он заявляет, что он вызывает CreateTimerQueueTimer.

На этой странице указано, что "функции обратного вызова помещаются в очередь в пул потоков".

Другие вопросы по тегам