какая разница between System.Windows.Forms.Timer()а System.Windows.Threading.DispatcherTimer()? В каких случаях мы должны их использовать? какие-нибудь лучшие практики?
какая разница between System.Windows.Forms.Timer()а System.Windows.Threading.DispatcherTimer()? В каких случаях мы должны их использовать? какие-нибудь лучшие практики?
Ответы:
Windows.Forms.Timerиспользует цикл сообщений форм Windows для обработки событий таймера. Его следует использовать при записи событий синхронизации, которые используются в приложениях Windows Forms, и вы хотите, чтобы таймер запускался в основном потоке пользовательского интерфейса.
DispatcherTimerэто механизм синхронизации WPF. Его следует использовать, если вы хотите обрабатывать время аналогичным образом (хотя это не ограничивается одним потоком - каждый поток имеет свой собственный диспетчер), и вы используете WPF. Он запускает событие в том же потоке, что и Dispatcher.
В общем, WPF == DispatcherTimerи Windows Forms == Forms.Timer.
При этом есть также System.Threading.Timerтаймер, classкоторый запускается в отдельном потоке. Это хорошо для чисто числового расчета времени, когда вы не пытаетесь обновить пользовательский интерфейс и т. Д.
Я нашел здесь хорошую статью о таймерах с небольшими примерами: http://www.progware.org/Blog/post/Timers-in-WPF.aspx
В заключение:
Если DoSomething () манипулирует компонентами графического интерфейса пользователя, то с помощью таймера вам необходимо использовать: this.Dispatcher.Invoke ((Action) delegate {// КОД, СВЯЗАННЫЙ С GUI ЗДЕСЬ}, поскольку вы не можете напрямую обращаться к элементам управления графическим интерфейсом из другого потока. С помощью DispatcherTimer вы делаете не нужно этого делать.
Если DoSomething () выполняет трудоемкую задачу, тогда графический интерфейс в случае DispatcherTimer зависнет. В случае с таймером этого не произойдет, так как длинные методы выполняются в другом потоке.