如何使用调度程序加载多个图像
本文关键字:图像 加载 何使用 调度程序 | 更新日期: 2023-09-27 18:14:05
我有与这个问题相同的问题,这个问题得到了回答,这个答案似乎(理论上)也适用于我的问题。但我不知道如何实现提供的答案。
它建议当加载多个图像时,我批处理它们,只做几个,然后使用调度程序开始处理下几个。
我试着写一个叫做LoadNextFive(int startIndex)
的函数,在函数的最后,它只是这样称呼自己:this.Dispatcher.BeginInvoke(() => { LoadNextFive(startIndex + 5); });
,但它似乎没有工作。是我使用了错误的调度程序还是我实现了错误的答案?
——编辑
public void LoadNextImage()
{
if(m_enumerator.MoveNext())
{
if (!m_bitmapSources.ContainsKey(m_enumerator.Current))
{
ZipEntry imageEntry = m_zip.GetEntry(m_enumerator.Current);
using (Stream imageStream = m_zip.GetInputStream(imageEntry))
{
BitmapImage source = new BitmapImage();
source.SetSource(imageStream);
m_bitmapSources.Add(m_enumerator.Current, source);
}
m_dispatcher.BeginInvoke(() => LoadingTemplate.ChangeText(this, "")); //change loadingtext (provides % in future) and it calls this function again
}
else
{
m_dispatcher.BeginInvoke(() => LoadNextImage());
}
}else{
//starts after every image is done loading
LoadPages();
LoadMonths();
OnLoadComplete(new EventArgs());
}
}
似乎当我重写代码时,我忘记了要重写的部分。因此,bug仍然存在。上面的代码运行良好。所以我的问题现在已经过时了
您提到的问题和答案是关于一次可以加载多少图像到应用程序域以及由此产生的内存压力。你的问题似乎是关于与Dispatcher异步加载图像。
对于批处理,我会使用任务并行库(TPL)。它有一个ContinueWith方法,它可以很好地完成一些工作,并在初始工作完成后继续工作。
TPL提供了一些非常好的特性,可以异步调用几个链式任务,然后在UI线程上回调(我假设您想在UI的某个地方显示图像)。