Порівнюючи таймер з DispatcherTimer


98

в чому різниця between System.Windows.Forms.Timer()і System.Windows.Threading.DispatcherTimer()? У яких випадках ми повинні їх використовувати? якісь найкращі практики?

Відповіді:


111

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

DispatcherTimerє механізмом синхронізації WPF. Його слід використовувати, коли ви хочете обробляти таймінги аналогічним чином (хоча це не обмежується однією ниткою - у кожного потоку є свій диспетчер), і ви використовуєте WPF. Він запускає подію в тому самому потоці, що і диспетчер.

Загалом, WPF == DispatcherTimerі Windows Forms == Forms.Timer.

Це, як кажуть, також System.Threading.Timerє таймер, classякий спрацьовує на окремій потоці. Це добре для чисто числових хронометрів, коли ви не намагаєтесь оновити інтерфейс користувача тощо.


1
Дякуємо за вашу швидку відповідь. Отже, це означає, що коли я хочу мати таймер, пов’язаний з інтерфейсом користувача, я повинен використовувати DispatcherTimer, а коли хочу запустити таймер, який я не хочу заморожувати UL, я повинен використовувати System.Threading.Timer окремо нитка. Друге питання: якщо я хочу використовувати DispatcherTimer, і я хочу мати таймер, не прив’язаний до інтерфейсу користувача, чи повинен я викликати його в окремий потік за допомогою System.Threading.Timer або ще DisptacherTimer?
paradisonoir

3
Це залежить від того, що ви намагаєтеся зробити. Я рідко використовую System.Threading.Timer - я зазвичай дотримуюся Таймера диспетчера, а потім виконую вашу роботу (яка може блокувати ваш інтерфейс) в іншій потоці, використовуючи щось на кшталт BackgroundWorker. Таймери дійсно ніколи не повинні блокувати ваш інтерфейс, якщо ви не виконуєте "занадто багато" роботи в обробці подій.
Рід Копсей

У мене виникають проблеми з тим, що DispatcherTimer з'їдає процесор з часом. Чи є хороший спосіб впоратися з цим?
дискорак

Перевірте, що конкретно їсть процесор. Ви створюєте безліч таймерів, які не зупиняються?
Рід Копсі

3
Переконайтеся, що ви правильно встановили властивість інтервалу. Не робіть цього: timer1.Interval = новий TimeSpan (1000); // "1000" являє тики не мілісекунд! Процесор був надзвичайно високим, поки я не виправив це: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best

4

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

Як висновок:

Якщо DoSomething () маніпулює компонентами графічного інтерфейсу, то разом із Таймером вам потрібно використовувати: this.Dispatcher.Invoke ((Action) делегат {// GUI RELATED CODE ТУТ}, оскільки ви не можете отримати доступ до керування GUI з іншого потоку безпосередньо. З DispatcherTimer ви робите. не потрібно цього робити.

Якщо DoSomething () виконує трудомістке завдання, то GUI заморозиться у випадку DispatcherTimer. У випадку з таймером це не буде, оскільки довгий метос виконується в іншому потоці

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.