Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何在wpf桌面应用程序的后台加载照片,使其不会';t是否要花几秒钟的时间加载库中的下一张照片?_C#_Wpf_Xml - Fatal编程技术网

C# 我如何在wpf桌面应用程序的后台加载照片,使其不会';t是否要花几秒钟的时间加载库中的下一张照片?

C# 我如何在wpf桌面应用程序的后台加载照片,使其不会';t是否要花几秒钟的时间加载库中的下一张照片?,c#,wpf,xml,C#,Wpf,Xml,当前,我的程序从xml文件读取记录中的图像和文本,在屏幕上显示它们,然后单击“上一个/下一个”按钮移动到下一个记录。然而,在每张照片之间似乎需要几秒钟的加载时间,我希望它是即时的,就像Windows照片库…或Facebook照片一样(请记住,这不是一个web应用程序) 我发现了一些类似的情况,但没有一个适合我的情况。我尝试根据我的搜索创建一个类来处理后台加载,并在程序中调用它,但它充满了错误,甚至可能无法完成我希望它完成的任务: //ImageManager.cs class ImageMan

当前,我的程序从xml文件读取记录中的图像和文本,在屏幕上显示它们,然后单击“上一个/下一个”按钮移动到下一个记录。然而,在每张照片之间似乎需要几秒钟的加载时间,我希望它是即时的,就像Windows照片库…或Facebook照片一样(请记住,这不是一个web应用程序)

我发现了一些类似的情况,但没有一个适合我的情况。我尝试根据我的搜索创建一个类来处理后台加载,并在程序中调用它,但它充满了错误,甚至可能无法完成我希望它完成的任务:

//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?