在应用程序中,我展示了随着时间推移或用户点击“下一个/上一个”而旋转的横幅。
1)我需要在 Timer.Elapsed
方法中更新 UI 元素。根据我所找到的信息,似乎计时器的 tick 是在它们自己的线程上执行的,应该使用元素的 dispatcher 更新 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 线程上,Elapsed
在计时器线程上),可能会导致不稳定性?
DispatcherTimer
而不是Timer
。 - SheridanDispatcher
,因此您可能没有使用来自UI线程的Dispatcher
。为确保您正在使用它,可以使用Application.Current.Dispatcher
对象。另请参见Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher以获取更多信息。但是,DispatcherTimer
是此工作的正确工具,因为它避免了使用Dispatcher
对象的任何需要。 - Sheridan