Еще один сюрприз: оказывается в WPF метод обработчик Elapsed класса Timer из пространства имен System.Timers не может получить доступ к объектам формы, например при попытке считать свойство Tag, у объекта формы Image, бросается эксепшен, как я понял это связано с тем, что обработчик Elapsed выполняется в другом потоке, для которого прямой доступ запрещен, и возможен только через специальный класс Dispatcher.
Вместо System.Timers.Timer в моем случае оказалось легче использовать System.Windows.Threading.DispatcherTimer. Он во многом похож на обычный таймер, но главное его отличие в том, что он его обработчик выполняется в том же потоке (в очереди класса Dispatcher) что и форма с UI компонентами:
Если в обработчике таймера будет выполняться "тяжелый" код, который может привести к тому что компоненты формы перестанут откликаться на действия пользователя, то все таки лучше вынести такой код в другой поток используя обычный таймер System.Timers.Timer. А если понадобится доступ к объектам формы, то нужно использовать вызов Invoke:
Вместо System.Timers.Timer в моем случае оказалось легче использовать System.Windows.Threading.DispatcherTimer. Он во многом похож на обычный таймер, но главное его отличие в том, что он его обработчик выполняется в том же потоке (в очереди класса Dispatcher) что и форма с UI компонентами:
System.Windows.Threading.DispatcherTimer t = new System.Windows.Threading.DispatcherTimer(); t.Interval = new TimeSpan(500); t.Tick += new EventHandler(t_Tick); t.Start();
Если в обработчике таймера будет выполняться "тяжелый" код, который может привести к тому что компоненты формы перестанут откликаться на действия пользователя, то все таки лучше вынести такой код в другой поток используя обычный таймер System.Timers.Timer. А если понадобится доступ к объектам формы, то нужно использовать вызов Invoke:
this.Dispatcher.Invoke((Action)delegate { //код для доступа к UI }
Комментариев нет:
Отправить комментарий