【问题标题】:Attempted to read or write protected memory. exception in Websupergoo ABCPDF7 on dispose尝试读取或写入受保护的内存。 Websupergoo ABCPDF7 中的异常处理
【发布时间】:2011-08-23 07:23:34
【问题描述】:

我随机获得(在实时环境中,每 2 周一次,使用非常活跃且努力工作的 Windows 服务,它每天调整大约 50000 多张图像) AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

堆栈跟踪是: 堆栈:

at WebSupergoo.ABCpdf7.Internal.NDoc._Clear(IntPtr inDoc)
at WebSupergoo.ABCpdf7.Internal.NDoc.Clear(IntPtr inDoc)
at WebSupergoo.ABCpdf7.Doc.Clear()
at WebSupergoo.ImageGlue7.Canvas.Dispose(Boolean disposing)
at WebSupergoo.ImageGlue7.Canvas.Dispose()
at XXXXX.Classes.Imaging.Image.Resize(Int32 width, Int32 height, Boolean addTransparent) in <path>\Image.cs:line 149
at XXXXX.Classes.XXXXX.Object.Import.Media.CreateImageScale(String destDir, Int32 width) in <path>\Media.cs:line 272
at XXXXX.Classes.XXXXX.Object.Import.Media.CreateResizedImages(String threadId) in <path>\Media.cs:line 242
at XXXXX.Classes.XXXXX.Object.Import.Threading.ResizeThread.Run(Object o) in <path>\ResizeThread.cs:line 38

这里是resize方法的代码:

    public void Resize(int width, int height, bool addTransparent)
    {

        using (Canvas tempCanvas = new Canvas())
        {
            DrawOptions options = new DrawOptions();
            if (height == 0)
            {
                if (width <= Width)
                {

                    options.Limit = new Size(width, 0);
                }
                else
                {
                    double scale = (double)width / (double)Width;

                    options.Transform.Magnify(scale, scale, 0, 0);

                }
            }
            else if (width == 0)
            {

                if (height <= Height)
                {
                    options.Limit = new Size(0, height);
                }
                else
                {
                    double scale = (double)height / (double)Height;

                    options.Transform.Magnify(scale, scale, 0, 0);
                }
            }
            else
            {
                double scaleX = (double)width / (double)Width;
                double scaleY = (double)height / (double)Height;

                options.Transform.Magnify(scaleX, scaleY, 0, 0);
            }

            //add transparency if set.
            if (addTransparent)
                options.Transparency = true;

            tempCanvas.DrawImage(CurrentImage, options);

            CurrentImage = tempCanvas.ToImage();
        } <<<<---- HERE WE GET THE EXCEPTION ON THE DISPOSE
    }

谁能帮我解决我收到此错误的原因,或者我可以做些什么。

【问题讨论】:

    标签: image-processing dispose access-violation abcpdf


    【解决方案1】:

    您是否执行任何非线程安全操作?从这里很难说,但是 GC 可能会过早地破坏另一个线程试图使用的东西——这可能会导致看起来随机的行为。您可以将整个事物转换为静态方法或使用互斥锁或其他同步方法。

    我注意到的另一件事:什么是宽度和高度,宽度和高度?我不明白为什么你应该关心零宽度图像而不是丢弃异常。我从来没有使用过 NDoc,但你在生产代码中将它放在堆栈上似乎也很奇怪。

    【讨论】:

    • 我不直接使用 NDoc 它是使用它们的 Canvas。我也一直小心线程。我不认为那是问题。但我会仔细检查,看看是否有任何共享的东西可能是问题。只是奇怪的是,如果这就是问题,它不会发生更多。我可以在线程池中排队多达 1000 个线程,这样的冲突应该比有时很少发生。
    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2014-08-07
    相关资源
    最近更新 更多