来自计时器线程的WPF UI更新

时间:2014-09-04 15:08:29

标签: c# wpf multithreading timer dispatcher

在App中,我会显示随着时间的推移或用户点击下一个/上一个时间而旋转的横幅。

1)我需要在Timer.Elapsed方法中更新UI元素。根据我的发现,似乎计时器滴答在他们自己的线程上执行,元素的调度程序应该用于更新UI。

( (Image)BannerPanel.Content ).Dispatcher.Invoke( new Action( () => {
    ( (Image)BannerPanel.Content ).Source = GetImage( new Uri( banner.Uri, UriKind.Absolute ) );
} ) );

但会引发InvalidOperationException

2)横幅控制器提供NextPrevious方法,分别称为显示下一个/上一个横幅。当DisplayBanner方法尝试显示横幅时,当找不到文件时,它会尝试使用WebClient的{​​{1}}重新下载它,并在AsyncFileDownload上显示图像。我是否正确地假设计时器和DownloadComplete / Elapsed的手动调用同时发生的Next都可以在他们自己的线程上运行{{1} UI线程上的/ Previous和Timer线程上的Previous,可能导致不稳定?

2 个答案:

答案 0 :(得分:2)

您应该考虑使用DispatcherTimer类而不是常规Timer。它被设计为与WPF UI一起用于这些类型的用途,因为它在Dispatcher线程上运行。

更多信息:System.Windows.Threading.DispatcherTimer

答案 1 :(得分:1)

尝试使用Application,

Application.Current.Dispatcher.Invoke(new Action(() => 
{
    ((Image)BannerPanel.Content).Source = GetImage(new Uri(banner.Uri, UriKind.Absolute));
});