C# System.Drawing.Image.FromStream OutOfMemory异常

C# System.Drawing.Image.FromStream OutOfMemory异常,c#,asp.net,memory-management,out-of-memory,C#,Asp.net,Memory Management,Out Of Memory,第一行调用Image.FromStream时,System.OutOfMemoryException出现故障: 使用(System.Drawing.Image i=System.Drawing.Image.FromStream(新的System.IO.MemoryStream(ucDocument1.UploadedFiles[0].FileBytes))){ //这里有附加代码 } 字节数组来自DevExpress.Web.ASPxUploadControl.ASPxUploadContro

第一行调用
Image.FromStream
时,System.OutOfMemoryException出现故障:

使用(System.Drawing.Image i=System.Drawing.Image.FromStream(新的System.IO.MemoryStream(ucDocument1.UploadedFiles[0].FileBytes))){
//这里有附加代码
}

字节数组来自
DevExpress.Web.ASPxUploadControl.ASPxUploadControl
对象,一项将失败案例字节数组写入数据库并从数据库成功重读的测试证明字节数组有效。对于不同大小的PNG和JPG文件,该操作是成功的,而对于特定已知的未损坏PNG/JPG文件,即使是比成功案例小的文件,该操作也失败。反复失败的文件会产生
System.OutOfMemoryException
异常。如何解决这个问题呢?

假设你没有泄漏任何东西,似乎有一些病理情况下GC不能正常工作。例如,如果您使用AsParallel作为并行查询的一部分运行Image.FromStream,我们发现在一些机器配置中可能会耗尽内存

pstrjds建议的解决方案对我们有效

  try
  {
      return (Bitmap)Image.FromStream(stream);
  }
  catch (OutOfMemoryException)
  {
      // retry only once. If it keeps failing it may be something more serious
      GC.Collect();
      GC.WaitForFullGCComplete();
      GC.WaitForPendingFinalizers();
      GC.Collect();
      return (Bitmap)Image.FromStream(stream);
  }

希望这能有所帮助。

您是每次都在相同的图像上出现故障,还是更随机?您是否尝试过处理
OutOfMemoryException
并调用a,然后重试该操作?我在使用另一个处理多页tiff文件的应用程序时发现,有时它会由于内存问题而无法保存页面,但调用GC.Collect会帮助它成功。我认为垃圾收集没有问题,因为在我的测试用例中,相同的文件重复出现错误。好的,这就是为什么我问它是否与相同的图像一致的部分原因。如果它是随机的,那么我会导致内存问题。您是否尝试过只获取导致错误的图像的字节,然后直接在测试应用程序中加载这些字节,您所做的只是加载图像?而没有看到其余的代码,
失败的文件
-是您在程序执行期间尝试加载的第一个图像,还是您在成功加载其他图像后尝试加载它?这些其他
JPG
失败的文件,您能否成功加载到例如
Windows Paint
<代码>绘制.NET<代码>Photoshop等?JPG中有许多不同的编解码器。如果它们在那里失败,那么可能不支持编解码器。不确定从那时起.NET是否已更新