Создает ли таймер новый поток?

        timer.Interval = 5000;
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();

Метод "timer_Tick" запускается в новом потоке или все еще находится в потоке, в котором он был создан?

Ответ 1

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

Я предполагаю, что вы говорите о System.Windows.Forms.Timer, который реализован с использованием цикла сообщений потока. В основе таймера WinForms лежит Win32 API SetTimer(), который работает, отправляя сообщения WM_TIMER в очередь сообщений потока, который SetTimer().

Одним из следствий этого является то, что если у вас есть обработчик событий, который занимает больше времени, чем ваш интервал таймера, ваш таймер не будет срабатывать с заданным интервалом. Если это была проблема, вам нужно разместить свой таймер в другом потоке.

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

Ответ 2

Таймер на самом деле не работает. То есть, когда вы запускаете таймер, операционная система создает некоторые структуры данных, которые сообщают ему периодически выдавать "тик" - в любой период, который вы указали. Но это не похоже на то, что таймер сидит там, вращаясь, питаясь ресурсами процессора, пока он ждет подходящее время. Все типы таймеров .NET и типы таймера Windows API работают таким образом.

Разница в том, что происходит, когда приходит время сделать галочку. Как отметил @David Hefferman, с System.Windows.Forms.Timer обработчик события Elapsed вызывается в том же потоке, который создал таймер. System.Threading.Timer вызывает обратный вызов в потоке пула потоков. Под капотом System.Timers.Timer вызывается в потоке пула, но вы можете использовать свойство SynchronizingObject, чтобы поднять событие Elapsed в потоке пользовательского интерфейса или любом другом потоке.