gpt4 book ai didi

c# - WPF UI 卡住 - UI 线程冲突?

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:29 28 4
gpt4 key购买 nike

我正在尝试使用 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();
}));
});
}

同时, Canvas 底部有一个滚动的文本横幅。这也在它自己的线程中运行,通过 Dispatcher 更新 UI。

每隔几张图片,滚动文本幻灯片都会暂停一两秒,似乎在等待图片加载。此行为是意外的,因为每个元素都在一个单独的线程中。


这可能是更新 UI 线程的两个任务线程之间的冲突吗?
可能是什么原因造成的?

最佳答案

将工作放在另一个线程上的代码不会将工作放在另一个线程上。您的 BeginInvoke 将它发送回 UI 线程,您的所有工作都在那里完成。

在执行 BeginInvoke 调用之前完成繁重的工作,以便工作实际发生在后台线程上。

private void LoadImage()
{
Task t = Task.Run(() =>
{
//I assume BitmapFromUri is the slow step.
var bitmap = BitmapFromUri(new Uri(compPath + oComps[nCount].name);

//Now that we have our bitmap, now go to the main thread.
this.Dispatcher.BeginInvoke((Action)(() =>
{
TimeSpan delay = new TimeSpan(0, 0, 0, 0, 0);

//I assume Fader is a control and must be on the UI thread, if not then move that out of the BeginInvoke too.
Fader.ChangeSource(image, bitmap), 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();
}));
});

我怀疑你的横幅实际上也没有在另一个线程上工作,你可能想看看它。


如果可能的话,一个更好的解决方案是将 BitmapFromUri 重写为异步的并且根本不使用线程。

private async Task LoadImageAsync()
{
TimeSpan delay = new TimeSpan(0, 0, 0, 0, 0);

var bitmap = await BitmapFromUriAsync(new Uri(compPath + oComps[nCount].name);
Fader.ChangeSource(image, bitmap), delay, delay);
image.Visibility = System.Windows.Visibility.Visible;

mediaElement.Stop();
mediaElement.Close(); ;
mediaElement2.Stop();
mediaElement2.Close();
mediaElement.Visibility = System.Windows.Visibility.Collapsed;
}

关于c# - WPF UI 卡住 - UI 线程冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518760/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com