Вопрос по timer, c# – Сравнение таймера с DispatcherTimer

92

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

Ваш Ответ

2   ответа
106

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

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

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

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

У меня проблема с загрузкой процессора DispatcherTimer с течением времени. Есть хороший способ справиться с этим?
Убедитесь, что вы правильно установили свойство интервала. Не делайте этого: timer1.Interval = new TimeSpan (1000); // & quot; 1000 & quot; представляет тики, а не миллисекунды! Процессор был очень высоким, пока я не исправил его следующим образом: timer1.Interval = System.TimeSpan.FromSeconds (1);
Это зависит от того, что вы пытаетесь сделать. Я редко использую System.Threading.Timer - я обычно использую Dispatcher Timer, а затем выполняю вашу РАБОТУ (которая может блокировать ваш пользовательский интерфейс) в другом потоке, используя что-то вроде BackgroundWorker. Таймеры действительно никогда не должны блокировать ваш пользовательский интерфейс, если вы не делаете "слишком много" работать в их обработчике событий.
Проверьте, что конкретно съедает процессор. Вы создаете много таймеров, которые не останавливаются?
Спасибо за ваш быстрый ответ. Таким образом, это означает, что всякий раз, когда я хочу иметь таймер, связанный с пользовательским интерфейсом, я должен использовать DispatcherTimer, а когда я хочу запустить таймер, который я не хочу замораживать UL, я должен использовать System.Threading.Timer в отдельном нить. Второй вопрос: если я хочу использовать DispatcherTimer и хочу, чтобы таймер не был связан с пользовательским интерфейсом, должен ли я вызывать его в отдельном потоке с помощью System.Threading.Timer или все еще DisptacherTimer? paradisonoir
4

http://www.progware.org/Blog/post/Timers-in-WPF.aspx

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

If DoSomething() manipulates GUI components then with the Timer you need to use: this.Dispatcher.Invoke((Action)delegate { //GUI RELATED CODE HERE} since you cannot access GUI controls from a different thread directly. With DispatcherTimer you do not need to do that.

If DoSomething() performas a time-consuming task, then the GUI will freeze in the case of the DispatcherTimer. In the case of the Timer it won't since the long methos is executed in a different thread

Хорошая ссылка.

Похожие вопросы