Подтвердить что ты не робот

Выполняется ли в System.Windows.Forms.Timer другой поток, чем пользовательский интерфейс?

У меня есть основной поток, который создает объект формы, который создает и устанавливает таймер для запуска функции с именем updateStatus() каждую минуту. Но updateStatus() также вызывается основным потоком в нескольких местах.

Тем не менее, я не совсем понимаю, вызовет ли она какие-либо проблемы с синхронизацией. Использует ли System.Windows.Forms.Timer в С# другой поток, отличный от основного потока?

4b9b3361

Ответ 1

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

У вас не будет проблем с синхронизацией. Это правильная версия таймера для использования в приложении WinForms; он специально предназначен для того, чтобы делать то, что вы просите. Он реализован под капотом, используя стандартный таймер Windows.

документация подтверждает это в разделе "Примечания":

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

Когда вы используете этот таймер, используйте событие Tick для выполнения операции опроса или для отображения заставки в течение определенного периода времени. Всякий раз, когда для свойства Enabled установлено значение true, а свойство Interval больше нуля, событие Tick увеличивается с интервалами на основе значения свойства Interval.

Ответ 2

Нет, событие таймера Tick генерируется из потока пользовательского интерфейса контуром сообщения, когда он получает сообщение WM_TIMER. Вы всегда хорошо справляетесь с этим, он может работать только тогда, когда поток пользовательского интерфейса простаивает.

Ответ 3

Нет.

Весь смысл таймера Windows.Forms заключается в том, что он работает в потоке графического интерфейса.

Windows (WinForms) запускает что-то, называемое MessagePump (см. Application.Run()), и именно это делает таймер возможным.

Весь ваш код как-то работает как часть Eventhandler, а тикер Timer никогда не "прерывает" любой другой обработчик событий.

Ответ 4

Таймер Windows.Forms возвращает событие обратно в поток пользовательского интерфейса, предположительно через sync-context.

Если вы хотите использовать не-UI-поток, есть другие таймеры - например, System.Timers.Timer или System.Threading.Timer

Ответ 5

В соответствии с документацией он запускается в основном потоке пользовательского интерфейса:

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