CSharp - C# BitmapPalette内存异常不足

  显示原文与译文双语对照的内容

我有下面的代码在循环中运行。


public void Test(Bitmap bmp)


{


 FormatConvertedBitmap fBitmapSource = new FormatConvertedBitmap();


 PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder();


 BitmapImage bi = new BitmapImage();



 using (MemoryStream ms = new MemoryStream())


 {


 bmp.Save(ms, ImageFormat.Png);


 bmp.Dispose();


 bmp = null;



 bi.BeginInit();


 bi.StreamSource = ms;


 bi.EndInit();



 BitmapPalette pallete = new BitmapPalette(bi, 256);


. . .



末行


BitmapPalette pallete = new BitmapPalette(bi, 256);



有时引发以下异常


Insufficient memory to continue the execution of the program.at System.Windows.Media.Imaging.BitmapPalette..ctor(BitmapSource bitmapSource, Int32 maxColorCount)



有什么想法我有足够的内存来继续执行。

时间: 原作者:

托管程序中还有它的他一些来自管理内存运行的内存来源。 当转换由遗留本机代码返回的错误代码时,也会引发这里异常。 E_OUTOFMEMORY方法调用可以返回的错误一样。 在你的情况下,GDI+ 。 它只有 20个不同的错误代码表示失败,你会在中找到这些错误的答案。 其中一个是。

这意味着不止一件事情。 内存不足,非托管非托管内存,GDI+ 用来存储位图像素的类型当然是可能的。 它也可以表示你的进程已经用光了可用的GDI对象句柄,Windows的句柄配额为 10,000个GDI句柄。 这是一个巨大的数字,超过这个配额几乎总是表明代码中的一个 Bug 。 处理程序泄漏,这几乎总是由于忘记使用 Image.Dispose() 方法而不使垃圾回收器经常发布句柄。

遗憾的是,它甚至可以被损坏的位图数据触发,不可能在你的情况下,因为你。 指示句柄泄漏,在 Taskmgr.exe, 进程选项卡中应该可以很容易可见。 查看+ 选择列并选中GDI对象。 在测试过程时,请注意你的进程的显示值。 不断增加的数字会引起麻烦,当它到达 10,000时就结束了。 还可以查看"提交大小"列,它可以显示使用过多非托管内存的麻烦。

原作者:
...