в чому різниця 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. Він запускає подію в тому самому потоці, що і диспетчер.
Загалом, 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) делегат {// GUI RELATED CODE ТУТ}, оскільки ви не можете отримати доступ до керування GUI з іншого потоку безпосередньо. З DispatcherTimer ви робите. не потрібно цього робити.
Якщо DoSomething () виконує трудомістке завдання, то GUI заморозиться у випадку DispatcherTimer. У випадку з таймером це не буде, оскільки довгий метос виконується в іншому потоці