2016-08-19 9 views
1

Я пытаюсь понять, как System.Threading.Timer или таймер в .net действительно работает на условиях низкого уровня. То, что я пытаюсь получить, - это обзор.System.Threading.Timer реализация низкого уровня

Мое сомнение заключается в том, что таймер выполнен, поток или процесс всегда запущены, как он получает уведомление о том, что время закончилось, оно получает как прерывание часов или ПИТ или что-то еще ?. Если не всегда работает, как будет корректно время, если есть время, когда поток или процесс не работают.

+1

Это встроенный в CLR и сильно переработан с версиями .NET. Не все версии CLR опубликовали исходный код, поэтому на этот вопрос нет прямого ответа. Вы не должны спрашивать об этом, если это не вызвано телефонным звонком в службу поддержки Microsoft. Кому, несомненно, хочется знать, как выглядит * реальная проблема. Здесь совсем другое. –

ответ

2

Использование потока будет работать, но это очень неэффективно.

Таймеры - это всего лишь структуры данных. Существует структура данных на основе .NET и структура данных ядра. Ядра знают, как уведомлять поток, когда требуется какой-то срок. Нет необходимости, чтобы поток сидел и ждал. (Упрощение этого немного.)

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

Таймеры действительно дешевые по сути.

+0

Хорошо, я вижу, так что я сомневаюсь, есть ли процесс, который всегда работает с некоторым интервалом, проверяя таймеры в очереди, чтобы увидеть те, которые истекли? – kprincipe

+0

Всякий раз, когда изменяется набор таймеров, каркас вычисляет время, в течение которого происходит самое раннее. Он устанавливает таймер ядра для этого крайнего срока. По истечении этого срока он истекает как таймеры уровня .NET сразу и снова перенастраивает таймер ядра, чтобы пройти на следующем таймере уровня .NET. – usr

+0

Я нашел билет Coreclr, который объясняет некоторые детали недавней версии фрейма: https://github.com/dotnet/coreclr/issues/6155. Так как вам интересно, это может быть интересно. – usr

0

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

Таймер не является точным вплоть до миллисекунды. Я думаю, что разрешение составляет около 15 мс.

Im не полностью уверен, если это так, как это делается на самом деле, поэтому я надеюсь, что вы получите еще несколько ответов.

 Смежные вопросы

  • Нет связанных вопросов^_^