Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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# 从服务器获取位图时内存不足?_C#_Memory_Compact Framework_Bmp - Fatal编程技术网

C# 从服务器获取位图时内存不足?

C# 从服务器获取位图时内存不足?,c#,memory,compact-framework,bmp,C#,Memory,Compact Framework,Bmp,我正在制作一个应用程序,它使用许多图像。应用程序从服务器获取图像,并一次下载一个图像。 在许多图像之后,位图的创建返回一个异常,但我不知道如何解决这个问题。以下是我下载图片的功能: public static Bitmap getImageFromWholeURL(String sURL) { HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(sURL); myRequest.Me

我正在制作一个应用程序,它使用许多图像。应用程序从服务器获取图像,并一次下载一个图像。 在许多图像之后,位图的创建返回一个异常,但我不知道如何解决这个问题。以下是我下载图片的功能:

 public static Bitmap getImageFromWholeURL(String sURL)
    {

        HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(sURL);
        myRequest.Method = "GET";


        // If it does not exist anything on the url, then return null
        try
        {
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream());
            myResponse.Close();
            return bmp;
        }
        catch (Exception e)
        {
            return null;
        }

      }
有人能帮我吗?
提前谢谢

“许多图像”当然与内存不足密切相关。位图可能会变大,它们会占用大量非托管虚拟内存。你必须使你的程序更智能,并在内存中存储更少的位图。或者将它们临时保存到文件中。或在必要时重新下载。并使用Dispose()方法正确清理资源,这对于位图类尤其重要。

如何处理System.Drawing.Bitmap对象?你把它们都记在记忆里了吗?然后,不可避免地会在某个时刻出现内存不足异常


根据您的需要,您应该在某个时候丢弃这些图像。如果您确实需要它们,请将它们存储在闪存中的文件中。另外,尝试使用较小的文件。

将响应流传送到磁盘,而不是将其保存在内存中。然后将保存到临时位置的图像信息保留在周围,而不是图像本身。

如果您在图片盒中显示这些信息(根据您的评论,我认为您是),则应处理旧图像(帮助解释):


作为样式的旁注,方法名应该是PascalCase,而不是camelCase,我会失去关于参数的匈牙利概念。

您对返回的bmp对象做什么?把代码贴在这里。我下载的每一张图片都用在一个图片盒里。这可能就是原因。我正在下载最大250kb的.png小文件。png文件的大小无关紧要。重要的是图像的尺寸。转换为位图时,所需的内存为宽度*高度*[每像素位数]。位数取决于像素格式(可以是16、24或32位)。我不知道哪个是默认值。您可以尝试使用不同的构造函数来调整此设置。我下载的每个图像都在picturebox中使用。所以这可能就是原因。是的,这迟早会结束的。只使用固定数量的PBs,编写一个滚动算法,将现有PBs重新用于新图片。别忘了处理()旧的。是的,我做了一个滚动算法,但它没有处理任何PB,但现在它已经实现并工作了:)但是如果重用PB而不是删除整个PB并插入新的if滚动到该区域,它可能会做得更好。啊,很抱歉误解了我对picturebox的评论。每个图像都有自己的picturebox。但我想我已经找到了一个可以接受的解决办法。我有一个算法,检查最近的邻居,并检查它是否有图像。如果邻居不包含图像->下载图像。我现在还需要做的是有一个算法来删除视图中不存在的图像。这样我就不会在内存中保存那么多图像。
if(myPictureBox.Image != null)
{
    myPictureBox.Image.Dispose();
}
myPictureBox.Image = getImageFromWholeURL(url);