Выполняется ли в System.Windows.Forms.Timer другой поток, чем пользовательский интерфейс?
У меня есть основной поток, который создает объект формы, который создает и устанавливает таймер для запуска функции с именем updateStatus() каждую минуту. Но updateStatus() также вызывается основным потоком в нескольких местах.
Тем не менее, я не совсем понимаю, вызовет ли она какие-либо проблемы с синхронизацией. Использует ли System.Windows.Forms.Timer в С# другой поток, отличный от основного потока?
Ответы
Ответ 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 таймер предназначен для однопоточная среда, в которой пользовательский интерфейс потоки используются для выполнения обработка. Это требует, чтобы пользователь код имеет доступ к сообщению о пользовательском интерфейсе и всегда работают от того же нить или маршал вызова на другой поток.