从计时器线程更新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) 条幅控制器提供NextPrevious方法,当调用它们时,分别显示下一个/上一个条幅。当DisplayBanner方法尝试显示横幅时,当找不到文件时,它尝试使用WebClientAsyncFileDownload重新下载,并在DownloadComplete上显示图像。我认为定时器触发的ElapsedNext/Previous的手动调用可以同时发生,两者都在自己的线程上运行(UI线程上的Previous/Next和定时器线程上的Elapsed),这可能会导致不稳定吗?

从计时器线程更新WPF UI

您应该考虑使用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));
});