2011-08-23 1 views
1

私は無作為に(非常にアクティブで堅牢なWindowsサービスで2週間に1回のライブ環境で、約50000+画像のサイズを変更します)AccessViolationException:保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。保護されたメモリを読み書きしようとしました。 Websupergooの例外でABCPDF7を処分しました

スタックトレースは次のとおりです。 スタック:

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 
    } 

誰が何を私がある場合、私はこのエラーを取得するか、なぜ私は解決することができます:

ここ
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 

は、リサイズメソッドのコードがありますそれについて行うことができます。

答えて

0

スレッドセーフでない操作を実行していますか?ここから言うのは難しいですが、GCは別のスレッドが使用しようとしているものを早すぎるものにするかもしれません。全体を静的メソッドに変換したり、mutexやその他の同期メソッドを使用することができます。

私が気づいた別のこと:幅と高さ、幅と高さは何ですか?私はなぜあなたが例外を削除するよりも幅のイメージを気にする必要があるか分からない。私はNDocを使ったことはありませんでしたが、生産コードのスタック上にあることは奇妙に思えます。

+0

私はNDocを直接使用していません。それを使用するCanvasです。また、私はスレッドに注意しています。私はそれが問題だとは思わない。しかし、私はそれが問題になる可能性のあるものがあるかどうかを再度チェックする。スレッドプールには最大1000個のスレッドがキューイングされていることがあります。そのような場合は、たまにはまれにしか発生しません。 – Swippen