Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 试图读取或写入受保护的内存。dispose上Websupergoo ABCPDF7中出现异常_Image Processing_Dispose_Access Violation_Abcpdf - Fatal编程技术网

Image processing 试图读取或写入受保护的内存。dispose上Websupergoo ABCPDF7中出现异常

Image processing 试图读取或写入受保护的内存。dispose上Websupergoo ABCPDF7中出现异常,image-processing,dispose,access-violation,abcpdf,Image Processing,Dispose,Access Violation,Abcpdf,我随机获得访问权限(在live环境中,每两周一次,windows服务非常活跃且工作非常努力,每天会调整50000多个图像的大小)异常:尝试读取或写入受保护的内存。这通常表示其他内存已损坏 堆栈跟踪是: 堆栈: 在WebSupergoo.ABCpdf7.Internal.NDoc.\u Clear(IntPtr inDoc) 位于WebSupergoo.ABCpdf7.Internal.NDoc.Clear(IntPtr inDoc) 在WebSupergoo.ABCpdf7.Doc.Clear(

我随机获得访问权限(在live环境中,每两周一次,windows服务非常活跃且工作非常努力,每天会调整50000多个图像的大小)异常:尝试读取或写入受保护的内存。这通常表示其他内存已损坏

堆栈跟踪是: 堆栈:

在WebSupergoo.ABCpdf7.Internal.NDoc.\u Clear(IntPtr inDoc)
位于WebSupergoo.ABCpdf7.Internal.NDoc.Clear(IntPtr inDoc)
在WebSupergoo.ABCpdf7.Doc.Clear()上
在WebSupergoo.ImageGlue7.Canvas.Dispose(布尔处理)
在WebSupergoo.ImageGlue7.Canvas.Dispose()上
在\Image.cs中的XXXXX.Classes.Imaging.Image.Resize(Int32宽度、Int32高度、布尔addTransparent)处:第149行
在\Media.cs中的XXXXX.Classes.XXXXX.Object.Import.Media.CreateImageScale(字符串destDir,Int32宽度):第272行
在\Media.cs中的XXXXX.Classes.XXXXX.Object.Import.Media.CreateResizedImages(字符串threadId):第242行
在\ResizeThread.cs:38行中的XXXXX.Classes.XXXXX.Object.Import.Threading.ResizeThread.Run(对象o)处
以下是调整大小方法的代码:

    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
    }
public void Resize(int-width、int-height、bool-addTransparent)
{
使用(Canvas tempCanvas=new Canvas())
{
DrawOptions=新的DrawOptions();
如果(高度==0)
{

如果(width您是否执行了任何非线程安全的操作?很难说,但是GC可能会过早地破坏另一个线程试图使用的东西-这可能会导致随机行为。您可以将整个操作转换为静态方法或使用互斥体或其他同步方法


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

我没有直接使用NDoc,它是使用它们的画布。我也一直很关心它e线程。我不认为这是问题。但我会再次检查,看看是否有任何共享的东西可能是问题。只是奇怪的是,如果这是问题,它不会发生更多。我可以有多达1000个线程在线程池中排队,这应该比偶尔发生的冲突更多。
    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
    }