【发布时间】:2014-09-04 23:30:05
【问题描述】:
在应用程序中,我会显示随着时间的推移或用户单击下一个/上一个而旋转的横幅。
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) 横幅控制器提供Next 和Previous 方法,分别在调用时显示下一个/上一个横幅。当DisplayBanner 方法尝试显示横幅时,当找不到文件时,它会尝试使用WebClient 的AsyncFileDownload 重新下载它,并在DownloadComplete 上显示图像。我是否正确假设计时器触发的Elapsed 和Next/Previous 的手动调用可以同时发生,两者都在自己的线程上运行(Previous/Next 在 UI 上thread 和 Elapsed 在 Timer thread 上),可能导致不稳定?
【问题讨论】:
-
只需使用
DispatcherTimer而不是Timer。 -
每个线程都有一个
Dispatcher,因此您可能没有使用 UI 线程中的那个。为确保您是,您可以使用Application.Current.Dispatcher对象。另请参阅Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher 了解更多信息。但是,DispatcherTimer是这项工作的正确工具,因为它避免了使用Dispatcher对象的任何需要。
标签: c# wpf multithreading timer dispatcher