C# 我如何在wpf桌面应用程序的后台加载照片,使其不会';t是否要花几秒钟的时间加载库中的下一张照片?
当前,我的程序从xml文件读取记录中的图像和文本,在屏幕上显示它们,然后单击“上一个/下一个”按钮移动到下一个记录。然而,在每张照片之间似乎需要几秒钟的加载时间,我希望它是即时的,就像Windows照片库…或Facebook照片一样(请记住,这不是一个web应用程序) 我发现了一些类似的情况,但没有一个适合我的情况。我尝试根据我的搜索创建一个类来处理后台加载,并在程序中调用它,但它充满了错误,甚至可能无法完成我希望它完成的任务:C# 我如何在wpf桌面应用程序的后台加载照片,使其不会';t是否要花几秒钟的时间加载库中的下一张照片?,c#,wpf,xml,C#,Wpf,Xml,当前,我的程序从xml文件读取记录中的图像和文本,在屏幕上显示它们,然后单击“上一个/下一个”按钮移动到下一个记录。然而,在每张照片之间似乎需要几秒钟的加载时间,我希望它是即时的,就像Windows照片库…或Facebook照片一样(请记住,这不是一个web应用程序) 我发现了一些类似的情况,但没有一个适合我的情况。我尝试根据我的搜索创建一个类来处理后台加载,并在程序中调用它,但它充满了错误,甚至可能无法完成我希望它完成的任务: //ImageManager.cs class ImageMan
//ImageManager.cs
class ImageManager
{
private Dictionary<string, Image> images = new Dictionary<string, Image>();
public Image get(string s)
{ // blocking call, returns the image
return load(s);
}
private Image load(string s)
{ // internal, thread-safe helper
lock (images)
{
if (!images.ContainsKey(s))
{
Image img = images.Add(s, img); //load the image s - ERROR cannot implicitly convert type void to image. Void??
return img;
}
return images[s];
}
}
public void preload(params string[] imgs)
{ // non-blocking preloading call
foreach (string img in imgs)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, e) => { load(img); }; // discard the actual image return
bw.RunWorkerAsync();
}
}
}
//MainWindow.cs
ImageManager im = new ImageManager();
im.preload("Data/Images"); // Errors - im is a field but used like a type/token '('
//ImageManager.cs
类图像管理器
{
私有字典图像=新字典();
公共映像获取(字符串s)
{//阻塞调用,返回图像
返回荷载;
}
私有映像加载(字符串s)
{//内部,线程安全帮助程序
锁定(图像)
{
如果(!images.ContainsKey)
{
Image img=images.Add(s,img);//加载图像s-错误无法将类型void隐式转换为Image.void??
返回img;
}
返回图像[s];
}
}
公共无效预加载(参数字符串[]imgs)
{//非阻塞预加载调用
foreach(imgs中的字符串img)
{
BackgroundWorker bw=新的BackgroundWorker();
bw.DoWork+=(s,e)=>{load(img);};//放弃实际返回的图像
RunWorkerAsync();
}
}
}
//MainWindow.cs
ImageManager im=新的ImageManager();
im.预加载(“数据/图像”);//错误-im是一个字段,但与类型/标记“(”类似
非常感谢您提前考虑缓存缩小的图像-您想要显示的图像的1:1,甚至更小。这种方式加载预览会快得多,如果用户查看图像的时间足够长,您可以加载完整的图像 对于现代照片,图像的原始大小通常比正常显示的要大。所以,如果你总是阅读原始图像,你会在一些永远不会显示的东西上花费大量的磁盘IO
通常注意事项:在您的程序中可能不是这样。与任何性能问题度量一样,您的
ImageManager
应该使用ImageSource
s,而不是Image
s。即使您让当前代码正常工作,您也会发现您的UI仍然挂起,因为您别无选择,只能在UI线程。如果您改为处理ImageSource
s,则可以在后台线程上加载它们,然后冻结它们,以便从UI线程中使用它们。这使您可以提前加载图像,或在加载图像时显示加载动画
可能是您要用于加载图像的方法。您的错误行:Image img=images.Add(s,img)似乎有误。如何在右侧使用左侧变量img?