我遇到与this question中所述相同的问题,问题得到解答,答案似乎也(理论上)在我的问题中起作用。但我无法弄清楚如何实施the answer provided。
它建议在加载多个图像时,我将它们批处理,然后只做几个,然后使用调度程序开始处理下几个图像。
我试着编写一个名为LoadNextFive(int startIndex)
的函数,在函数的最后它只是调用它自己:this.Dispatcher.BeginInvoke(() => { LoadNextFive(startIndex + 5); });
但它似乎没有用。我是否使用调度员错误或者我的答案是否错误?
- EDIT-- 我目前只想加载1张图片。
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());
}
}
答案 0 :(得分:1)
似乎当我重写代码时,我忘了重写一部分。因此仍然是错误。上面的代码工作正常。所以我的问题现在已经过时了。
答案 1 :(得分:0)
您提到的问题和答案是关于您可以一次加载到应用程序域中的图像数量以及由此产生的内存压力。您的问题似乎是与Dispatcher异步加载图像。
对于批处理,我会使用Task Parallels Library(TPL)。它有一个ContinueWith方法,可以很好地完成一些工作,并在初始工作完成后继续工作。
TPL提供了一些非常好的功能,可以异步调用几个链接的任务,然后回调UI线程(因为我假设您想在UI中的某个位置显示图像)。