从计时器线程更新WPF UI
本文关键字:WPF UI 更新 线程 计时器 | 更新日期: 2023-09-27 18:20:49
在应用程序中,我会显示横幅,这些横幅会随着时间的推移或用户单击下一个/上一个时旋转。
1) 我需要更新Timer.Elapsed
方法中的一个UI元素。根据我的发现,计时器记号似乎是在它们自己的线程上执行的,应该使用元素的调度器来更新UI。
( (Image)BannerPanel.Content ).Dispatcher.Invoke( new Action( () => {
( (Image)BannerPanel.Content ).Source = GetImage( new Uri( banner.Uri, UriKind.Absolute ) );
} ) );
但是这抛出了CCD_ 2。
2) 条幅控制器提供Next
和Previous
方法,当调用它们时,分别显示下一个/上一个条幅。当DisplayBanner
方法尝试显示横幅时,当找不到文件时,它尝试使用WebClient
的AsyncFileDownload
重新下载,并在DownloadComplete
上显示图像。我认为定时器触发的Elapsed
和Next
/Previous
的手动调用可以同时发生,两者都在自己的线程上运行(UI线程上的Previous
/Next
和定时器线程上的Elapsed
),这可能会导致不稳定吗?
您应该考虑使用DispatcherTimer
类而不是常规的Timer
。它被设计为与WPF UI一起用于这些类型的用途,因为它运行在Dispatcher
线程上。
更多信息:System.Windows.Threading.DispatcherTimer
尝试使用应用程序,
Application.Current.Dispatcher.Invoke(new Action(() =>
{
((Image)BannerPanel.Content).Source = GetImage(new Uri(banner.Uri, UriKind.Absolute));
});