Сравнение таймера с DispatcherTimer - PullRequest
94 голосов
/ 10 июля 2009

в чем разница between System.Windows.Forms.Timer() и System.Windows.Threading.DispatcherTimer()? В каких случаях мы должны их использовать? какие-либо лучшие практики?

Ответы [ 2 ]

108 голосов
/ 11 июля 2009

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

DispatcherTimer - механизм синхронизации WPF. Его следует использовать, когда вы хотите обрабатывать синхронизацию аналогичным образом (хотя это не ограничивается одним потоком - каждый поток имеет своего диспетчера) и вы используете WPF. Событие запускается в том же потоке, что и диспетчер.

В общем WPF == DispatcherTimer и Windows Forms == Forms.Timer.

При этом существует также System.Threading.Timer, который является таймером class, который запускается в отдельном потоке. Это хорошо для чисто числовой синхронизации, когда вы не пытаетесь обновить пользовательский интерфейс и т. Д.

4 голосов
/ 01 марта 2012

Я нашел хорошую статью о таймерах с небольшими примерами здесь: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

В заключение:

Если DoSomething () манипулирует компонентами GUI, то с помощью таймера, который вам нужно использовать: this.Dispatcher.Invoke ((Action) делегат {// GUI RELATED CODE HERE}, поскольку вы не можете напрямую обращаться к элементам управления GUI из другого потока. DispatcherTimer вам не нужно этого делать.

Если DoSomething () выполняет трудоемкую задачу, то в случае DispatcherTimer графический интерфейс будет зависать. В случае с Таймером этого не произойдет, поскольку длинные методы выполняются в другом потоке

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