Какой поток использует Таймер во время ожидания? [Дубликат]

Новый (в 2014 году) tidyr пакет также делает это просто, при этом gather() / spread() является слагаемыми для melt / cast.

library(tidyr)
spread(dat1, key = numbers, value = value)

Из github ,

tidyr - это перерисовка reshape2, предназначенная для сопровождения аккуратной структуры данных и работающая рука об руку с magrittr и dplyr, чтобы построить сплошной конвейер для анализа данных.

Так же, как reshape2 сделал меньше, чем изменение, tidyr делает меньше, чем reshape2. Он разработан специально для сбора данных, а не для общей перестройки, которую делает reshape2, или общего преобразования, которое изменилось. В частности, встроенные методы работают только для кадров данных, а tidyr не содержит полей или агрегации.

blockquote>

3
задан 14 June 2011 в 06:44
поделиться

3 ответа

CLR использует выделенный поток, чтобы отслеживать активные таймеры System.Timers.Timer и System.Threading.Timer. Событие Elapsed поднимается на другой поток, вытащенный из потока.

Итак, да, они продолжают тикать, не затрагивая друг друга. Вы должны быть очень осторожны, вполне возможно, что ваш обработчик события Elapsed будет вызван снова, пока он все еще выполняется. Это происходит, когда это занимает больше времени, чем интервал. Или, что еще хуже, когда машина сильно загружена или у вас много активных потоков threadpool. Это может привести к очень тяжелой диагностике сбоя, если обработчик событий не является потокобезопасным. Это почти никогда не бывает. Установка свойства AutoReset таймера на значение false - это простой способ избежать этой проблемы.

4
ответ дан Hans Passant 22 August 2018 в 11:58
поделиться
  • 1
    Почему CLR нуждается в выделенном потоке? Не могли бы вы объяснить еще несколько вопросов? – Ivan Danilov 14 June 2011 в 07:28
  • 2
    Потому что ему нужно знать, когда нужно запустить поток threadpool для вызова события Elapsed. Этот материал не происходит автоматически. Логика проста, она просто просматривает список для таймера, который должен быть следующим, и так долго спит. – Hans Passant 14 June 2011 в 07:46
  • 3
    AFAIK есть объект таймера ядра, и на нем основана функциональность CLR. И этому объекту ядра, конечно, не требуется отдельный поток для ожидания. Я не могу точно сказать, как CLR реализуется внутренне, конечно, но наличие потока только для получения уведомлений таймера - это отходы. – Ivan Danilov 14 June 2011 в 07:51
  • 4
    Вы можете увидеть реализацию в исходном коде SSCLI20. Все еще работает таким образом, вы можете видеть, как поток начинается с отладчика в смешанном режиме. – Hans Passant 14 June 2011 в 07:56
  • 5
    Ну, я нашел поток под названием «.NET SystemEvents» и проверял источники - это, по сути, поток WndProc, обслуживающий сообщения Windows. Второй поток, предположительно, GC и мой основной поток. Проверка собственных потоков / стеков также не отображала ничего, содержащего ожидающий один следующий таймер. Если я что-то пропустил - извините, я не очень разбираюсь в низкоуровневой собственной отладке. Не могли бы вы указать место в SSCLI, где создание & amp; логика этой нити найдена? – Ivan Danilov 14 June 2011 в 08:48

Похоже, что он не будет блокироваться, если вы используете System.Threading.Timer или вызовите System.Timers.Timer без SynchronizingObject.

Аналогичный вопрос: Выполняют таймеры C # в отдельном потоке ?

3
ответ дан Community 22 August 2018 в 11:58
поделиться

Из документации System.Timers.Timer:

Таймер на основе сервера предназначен для использования с рабочими потоками в многопоточной среде. Таймеры сервера могут перемещаться между потоками для обработки поднятого события Elapsed, что приводит к большей точности, чем таймеры Windows, во время всплытия события.

Итак, да.

В дальнейшем, из документации свойства System.Timers.Timer.SynchronizingObject:

Когда SynchronizingObject имеет значение null, метод, обрабатывающий событие Elapsed, вызывается в потоке из пула системных потоков. Дополнительные сведения о пулах системных потоков см. В статье ThreadPool.

Таким образом, события поднимаются в потоках пула потоков, если не установлен параметр SynchronizingObject.

1
ответ дан Sven 22 August 2018 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: