C# Graphics.DrawImage OutOFMemory异常

C# Graphics.DrawImage OutOFMemory异常,c#,.net,asp.net,gdi+,out-of-memory,C#,.net,Asp.net,Gdi+,Out Of Memory,在尝试调整较大图像的大小时,我遇到了一个OutOfMemory异常。我们的服务器只能调整小于1000x1000像素的图像大小。我的开发机器似乎无法处理任何大小的问题,而其他开发机器似乎与服务器具有相同的限制。我的开发机器也是最好的规格 我觉得这段代码正确地处理了所有对象,但我可能错了。我尝试使用perfmon查看.Net CLR内存,但不确定如何解释结果 我被困在如何最好地解决这个问题,并得到一个明确的答案,为什么这个问题存在。任何调试想法都将不胜感激 编辑:g.DrawImage上出现错误 u

在尝试调整较大图像的大小时,我遇到了一个
OutOfMemory
异常。我们的服务器只能调整小于1000x1000像素的图像大小。我的开发机器似乎无法处理任何大小的问题,而其他开发机器似乎与服务器具有相同的限制。我的开发机器也是最好的规格

我觉得这段代码正确地处理了所有对象,但我可能错了。我尝试使用perfmon查看.Net CLR内存,但不确定如何解释结果

我被困在如何最好地解决这个问题,并得到一个明确的答案,为什么这个问题存在。任何调试想法都将不胜感激

编辑:g.DrawImage上出现错误

using(Image imgToResize = Image.FromFile(path))
        {
            using (Bitmap b = new Bitmap(ResizeWidth, ResizeHeight, PixelFormat.Format24bppRgb))
            {
                using(Graphics g = Graphics.FromImage(b))
                {
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.DrawImage(imgToResize, 0, 0, ResizeWidth, ResizeHeight);
                    b.Save(DiskPathThumb(maxSize), ImageFormat.Jpeg);
                }
            }
        }

您能为PrivateBytes、LOH大小、#Gen 2集合提供屏幕截图计数器吗

这是什么类型的应用程序?这对您的应用程序代码有多深?在LOH上有多少个对象?因为返回的缓冲区肯定是一个大对象。您是否查看了调用堆栈、堆的状态以及调用触发时的碎片

fWW,您可以尝试使用GDI的C或C++版本中的相同代码。您正在使用的每一个与图形相关的函数都是GDI的包装器,在失败机器上的测试应用程序中测试这些函数将有助于将范围缩小到.Net Framework,而不是其他东西


我无法获得OOM异常,但在函数抛出InvalidParameterException之前,我可以传递的最大值约为19866x19866。这是在64位Win7 targeting.Net 4 w/VS2010上。

结果表明,这与我们使用
SessionPageStatePersister
有关,这导致我们的
gen2
堆栈随着时间的推移稳步上升,在应用程序池回收之前的某个时候,我们的系统根本无法处理太多


此后,我们已恢复到标准隐藏字段视图状态,此错误已消失。

在OnPaint事件中,您在何处调用此代码?其调用的post文件上载到服务器。有时它甚至不会在请求缩略图时上传。无论哪种方法都会得到相同的结果。它在哪一行失败?总是一样的吗?另外,ResizeWidth和ResizeHeight的值是多少?有时GDI+会抛出内存不足异常,而这些异常并不是真正的内存不足异常。很抱歉,错误发生在
g.DrawImage
,调整大小的值通常非常小。可能在100-300px之间。如果参数无效,某些GDI+函数会抛出
OutOfMemory
异常。虽然我看不出在你的代码中会发生什么。因为您的参数似乎总是有效的。而你超负荷的
drawinimages
文档也没有提到这一点。