C# 为什么listbox在从独立存储中获取图像而不是从程序集中嵌入的图像时会消耗这么多内存?

C# 为什么listbox在从独立存储中获取图像而不是从程序集中嵌入的图像时会消耗这么多内存?,c#,.net,silverlight,windows-phone-7,windows-phone-7.1,C#,.net,Silverlight,Windows Phone 7,Windows Phone 7.1,我在Windows Phone Mango中创建了一个列表框 我将使用它来显示一个长长的列表中的许多照片 出于测试目的,我只使用一张照片,并对每个索引重复它 从独立存储器加载映像时,100个映像占用170MB内存 当我在程序集中将同一个图像作为资源(ie/Images/image1.jpg)进行embbed时,10000个图像仅消耗40MB。事实上,它从未超过40MB,不管这里发生了什么(UI虚拟化?),它都工作得很好 我必须为我的图像使用独立存储,因为图像更新会定期下载到手机上。我可以让它执行

我在Windows Phone Mango中创建了一个列表框

我将使用它来显示一个长长的列表中的许多照片

出于测试目的,我只使用一张照片,并对每个索引重复它

从独立存储器加载映像时,100个映像占用170MB内存

当我在程序集中将同一个图像作为资源(ie/Images/image1.jpg)进行embbed时,10000个图像仅消耗40MB。事实上,它从未超过40MB,不管这里发生了什么(UI虚拟化?),它都工作得很好

我必须为我的图像使用独立存储,因为图像更新会定期下载到手机上。我可以让它执行与嵌入图像相同的操作吗

谁能给我解释一下

  • 当我从独立存储中获取图像时,为什么它使用了这么多内存,加载越多,它就越高

  • 当我从images文件夹中获取它时,当它是程序集的一部分时,它如何加载成千上万的图像并且内存永远不会增加,这是UI虚拟化吗

  • 提前谢谢你的帮助

    这是我的密码。(6个月前才开始开发,如果它看起来有点不可靠的话!)

    //从独立存储中获取映像

    IsolatedStorageFile insISF = IsolatedStorageFile.GetUserStoreForApplication();
    
            for (int i = 0; i < 100; i++)
            {
                byte[] byte1;
    
                using (IsolatedStorageFileStream isfs = insISF.OpenFile("\\Photos\\image1.jpg", FileMode.Open, FileAccess.Read))
                {
                    byte1 = new byte[isfs.Length];
                    isfs.Read(byte1, 0, byte1.Length);
                    isfs.Close();
                }
    
                Image image = new Image();
                MemoryStream ms = new MemoryStream(byte1);
                BitmapImage bi = new BitmapImage();
                bi.SetSource(ms);
                image.Source = bi;
                listBox2.Items.Add(image);
        //NOTE I HAVE TRIED "ms.Dispose();" HERE BUT IT DOES NOT HELP.
            }
    
    IsolatedStorageFile insISF=IsolatedStorageFile.GetUserStoreForApplication();
    对于(int i=0;i<100;i++)
    {
    字节[]字节1;
    使用(IsolatedStorageFileStream isfs=insISF.OpenFile(“\\Photos\\image1.jpg”,FileMode.Open,FileAccess.Read))
    {
    字节1=新字节[isfs.Length];
    读(字节1,0,字节1.Length);
    isfs.Close();
    }
    图像=新图像();
    MemoryStream ms=新的MemoryStream(字节1);
    BitmapImage bi=新的BitmapImage();
    bi.SetSource(ms);
    image.Source=bi;
    listBox2.Items.Add(图像);
    //注意:我在这里尝试了“ms.Dispose();”,但没有帮助。
    }
    
    //结束

    //从“图像”文件夹中获取图像作为程序集的一部分

            for (int i = 0; i < 10000; i++)
            {
            BitmapImage bi = new BitmapImage(new Uri("/Images/image1.jpg", UriKind.Relative));
            Image image = new Image();
            image.Source = bi;            
            listBox2.Items.Add(image);
            }
    
    for(int i=0;i<10000;i++)
    {
    BitmapImage bi=新的BitmapImage(新Uri(“/Images/image1.jpg”,UriKind.Relative));
    图像=新图像();
    image.Source=bi;
    listBox2.Items.Add(图像);
    }
    

    //结束

    是否可能是隔离的存储文件流和内存流对象

    尝试使用GC来监视for循环中每个迭代的内存使用情况

    在这两种情况下,listbox上的虚拟化都应该是一样的


    顺便说一句,您也应该在MemoryStream上使用using构造。

    在您的代码中,字节数组由垃圾回收器处理,垃圾回收器在超出范围后应显式处理的唯一对象是可以包含在
    using
    语句中的对象

    我从未尝试过,但我认为如果您直接从流中读取图像,而不是从流中读取图像,将图像写入数组并从数组中重新读取图像,然后使用语句将图像包含在
    中,那么应该释放内存


    希望对您有所帮助。

    当您从
    独立存储加载映像时,您可以逐个字节加载映像,即所有映像都已完全加载

    相反,当您创建
    位图图像
    时,默认情况下它使用
    延迟创建
    选项。所以,应用程序加载的图像现在只显示在屏幕上。有关详细信息,请参见
    CreateOption
    enum


    哇,回答得真快!我现在要检查一下垃圾收集器。我知道,但从未与之互动。我会发回任何结果。谢谢。请检查,是否可以使用
    Uri
    加载
    BitmapImage
    ,例如
    isostore://
    ,而不使用文件进行操作谢谢您的回复。这是有道理的,因为隔离存储方法需要更长的时间来加载。从独立存储中获取图像时,是否有延迟图像创建的方法?感谢您的回复。我会尝试一下,如果有帮助的话会告诉你。