Работает ли System.Windows.Forms.Timer в потоке, отличном от пользовательского интерфейса? - PullRequest
21 голосов
/ 17 апреля 2011

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

Однако мне не ясно, вызовет ли это какие-либо проблемы с синхронизацией. Работает ли System.Windows.Forms.Timer в C # в другом потоке, отличном от основного потока?

Ответы [ 5 ]

23 голосов
/ 17 апреля 2011

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

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

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

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

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

9 голосов
/ 17 апреля 2011

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

6 голосов
/ 17 апреля 2011

Нет.

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

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

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

5 голосов
/ 17 апреля 2011

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

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

2 голосов
/ 17 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...