使用System.IO.Stream时,如何避免OutOfMemoryException?

时间:2017-08-02 07:57:11

标签: c# stream out-of-memory bitmapsource

我正在制作扫描组件,但是当我为文档设置高分辨率(600 dpi)时,我只会在扫描1或2次后得到 System.OutOfMemoryException

我的代码如下

public ScannedImage SaveScannedImage(DataTransferredEventArgs e)
{
    if (e == null) throw new IOException();

    BitmapSource fullResImage;
    using (var fullResImageStream = e.GetNativeImageStream())
    {
        fullResImage = fullResImageStream.ConvertToWpfBitmap(e.ImageInfo.ImageWidth, e.ImageInfo.ImageLength);
    }

    BitmapSource lowResImage;
    using (var lowResImageStream = e.GetNativeImageStream())
    {
        lowResImage = lowResImageStream.ConvertToWpfBitmap(800, 0);
    }

    return new ScannedImage(lowResImage, fullResImage);
}

通常发生在

using (var lowResImageStream = e.GetNativeImageStream())

非常感谢帮助。

1 个答案:

答案 0 :(得分:0)

您看到的内容可能是由大对象堆(LOH)碎片引起的。

这很难避免,但你可以明确地压缩LOH。

GCSettings.LargeObjectHeapCompactionMode = 
    GCLargeObjectHeapCompactionMode.CompactOnce;

GC.Collect();

另外,请确保以64位进程运行。转动"首选32位"选项,如果它打开。

有关详细信息,您可能需要阅读