Сравнение таймера с DispatcherTimer

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

Ответ 1

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

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

В общем случае WPF == DispatcherTimer и Windows Forms == Forms.Timer.

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

Ответ 2

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

Как вывод:

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

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