Twain导致wpf应用程序内存不足

时间:2017-06-21 07:15:31

标签: wpf twain

我正在开展一个项目,该文档将包含许多图像的文档存档为文件或扫描图像,直到其中一个客户决定以高质量和彩色扫描图像为止。 现在应用程序以内存不足错误退出,并且当我监视计算机资源时,我发现它使用了如此多的内存,高达1.4 gig的情况。然后我使用/ LARGEADDRESSAWARE让它尽可能多地使用它,现在如果需要它会使用所有ram内存,这会再次导致内存不足错误。 问题是当我使用扫描仪默认应用程序(Avision)时,它使用的RAM少于400 MB并成功完成所有扫描。

我正在使用Saraff.Twain来处理扫描仪,我已经编写了自己的类来处理Saraff.Twain事件,如下所示:

using Tools;
using System;
using Saraff.Twain;
using System.Drawing.Imaging;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace Notary
{
    public class ScannerHandler
    {
        static Twain32 twain = new Twain32();
        public static event ScannerEventHandler ScannerEvent;
        public delegate void ScannerEventHandler(object sender, List<string> pathes);

        [DllImport("gdi32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool DeleteObject(IntPtr value);

        public ScannerHandler()
        {
            try
            {
                twain.OpenDSM();
            }
            catch (Exception e)
            {
                Accessories.ErrorHandler(e, true);
            }
            twain.ShowUI = true;
            twain.AcquireCompleted += AcquireCompleted;
        }

        private static void AcquireCompleted(object sender, EventArgs e)
        {
            try
            {
                if (ScannerEvent != null)
                {
                    List<string> output = new List<string>();
                    for (int i = 0; i < twain.ImageCount; i++)
                    {
                        string temp = Accessories.GenerateTempAddress("jpg");
                        twain.GetImage(i).Save(temp, ImageFormat.Jpeg);
                        output.Add(temp);
                    }
                    ScannerEvent.Invoke(sender, output);
                }
            }
            catch (Exception ex)
            {
                Accessories.ErrorHandler(ex, true);
            }
        }

        public static void Acquire()
        {
            try
            {
                twain.Acquire();
            }
            catch (Exception e)
            {
                Accessories.ErrorHandler(e, true);
            }
        }

        ~ScannerHandler()
        {
            try
            {
                twain.Dispose();
            }
            catch (Exception e)
            {
                Accessories.ErrorHandler(e, true);
            }
        }
    }
}

扫描程序完成时发生错误,所以我认为问题出在saraff.dll如何工作,或者我做错了什么?有没有办法一个一个地获取图像? 我应该使用任何其他dll扫描仪来更好地管理内存吗?

0 个答案:

没有答案