【发布时间】:2015-05-28 23:32:05
【问题描述】:
我正在尝试使用WPF 创建图像幻灯片效果。
在Windows.Forms.Timer 中每隔几秒调用一次使用新图像更新幻灯片的方法,并在Task 中的自己的线程中运行(如下所示)。
private void LoadImage()
{
Task t = Task.Run(() =>
{
this.Dispatcher.BeginInvoke((Action)(() =>
{
TimeSpan delay = new TimeSpan(0, 0, 0, 0, 0);
Fader.ChangeSource(image, BitmapFromUri(new Uri(compPath + oComps[nCount].name)), delay, delay);
image.Visibility = System.Windows.Visibility.Visible;
mediaElement.Stop();
mediaElement.Close(); ;
mediaElement2.Stop();
mediaElement2.Close();
mediaElement.Visibility = System.Windows.Visibility.Collapsed;
mediaElement2.Visibility = System.Windows.Visibility.Collapsed;
imageLoop.Interval = oComps[nCount].duration;
nCount++;
imageLoop.Start();
}));
});
}
同时,画布底部有一个滚动文本横幅,位于叠加层中。这也在它自己的线程中运行,通过Dispatcher 更新 UI。
每隔几张图片,滚动文本和幻灯片都会暂停一两秒,似乎在等待图片加载。这种行为是出乎意料的,因为每个元素都在一个单独的线程中。
这可能是两个更新 UI 线程的任务线程之间的冲突吗?
可能是什么原因造成的?
【问题讨论】:
-
您是否检查了图像加载请求何时发送到服务器,例如。 G。通过Fiddler?
-
顺便说一句,您为什么将
System.Windows.Forms.Timer与WPF一起使用?使用System.Windows.Threading.DispatcherTimer。此外,您在发布内容的第 12 行有一个额外的分号。此外,尝试在调用之外尽可能多地执行代码,因为那部分是阻塞的。最后,不要使用new TimeSpan(0,0,0,0),而是使用TimeSpan.Zero。考虑使用async/await。
标签: c# wpf multithreading