2011-08-23 3 views
1

무작위로 (라이브 환경에서 매우 적극적이고 열심히 작동하는 Windows 서비스로 2 주마다 한 번씩 약 50000+ 이미지의 크기가 조정됩니다.) AccessViolationException : 보호 된 메모리를 읽거나 쓰려고했습니다. . 이것은 종종 다른 메모리가 손상되었다는 표시입니다.보호 된 메모리를 읽거나 쓰려고 시도했습니다. Websupergoo의 예외 ABCPDF7 처분시

스택 트레이스는 다음과 같습니다 스택 : 여기

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 

가 크기 조정 방법에 대한 코드입니다 :

아무것도 I가있는 경우

사람이 나를 내가이 오류가 왜 해결하거나 도와 줄 수

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 
    } 
그것을 할 수 있습니다.

답변

0

스레드 안전하지 않은 작업을 수행합니까? 여기에서 말하기는 어렵지만 GC는 다른 스레드가 사용하려고 시도하는 것을 조기에 파괴 할 수 있습니다. 이는 무작위로 보이는 동작을 초래할 수 있습니다. 모든 것을 정적 메서드로 변환하거나 뮤텍스 또는 다른 동기화 메서드를 사용할 수 있습니다.

또 다른 주목할 점은 너비와 높이가 너비와 높이가 무엇입니까? 예외를 삭제하는 것보다 너비가 0 인 이미지를주의해야하는 이유가 표시되지 않습니다. 나는 NDoc을 한번도 사용하지 않았지만, 프로덕션 코드에서 스택에 가지고있는 것이 이상하게 보입니다.

+0

NDoc을 사용하지 않습니다. 직접 사용하는 캔버스입니다. 또한 스레딩에 관해서도주의를 기울였습니다. 나는 이것이 문제라고 생각하지 않는다. 그러나 문제가 될만한 것이 있다면 그것을 다시 점검 할 것이다. 그 이상한 일이라면 그 이상한 일이 일어난다는 것이 이상합니다. 스레드 풀에 최대 1000 개의 스레드가 대기 할 수 있으며, 때로는 rarly보다 더 많은 충돌이 있어야합니다. – Swippen

관련 문제