2017-10-15 4 views
1

일부 이미지를 처리하기 위해 Parallel.For 루프를 사용하고 있습니다. 내가 이미지를 저장하려고하면, 때때로 나는 예외 중이미지가 Parallel.For 루프에 저장되지 않습니다.

일반 오류가 +

일부 이미지 가져 GDI 발생 후이 예외가 몇 개의 파일을 저장 한 후 무작위로 제공 절약 할 수.

  • 나는 나의 코드 - 된 다른 비트 맵 이미지에 원래 비트 맵 이미지 개체를 할당 한 후 파일을 아래

을 저장 사이에 동기화 Monitor.Enter를 사용하여 시도

  • 을 절약하려고

    Parallel.For(0, 14, cnt => 
    { 
        using (Bitmap originalImage = (Bitmap)Bitmap.FromFile(@imagePath)) 
        { 
         for (int i = 0; i < originalImage.Width; i++) 
         { 
          for (int x = 0; x < originalImage.Height; x++) 
          { 
           System.Drawing.Color oc = originalImage.GetPixel(i, x); 
           int gray = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11)); 
           System.Drawing.Color nc = System.Drawing.Color.FromArgb(oc.A, gray, gray, gray); 
           originalImage.SetPixel(i, x, nc); 
          } 
         } 
         try 
         { 
          //Bitmap grayscaleImage = originalImage; 
          //grayscaleImage.Save(@processesImagesPath + DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + ".jpg"); //line of exception 
    
          //above lines did not work 
    
          Monitor.Enter(originalImage); 
          originalImage.Save(@processesImagesPath + DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + ".jpg"); //line of exception 
         } 
         finally 
         { 
          Monitor.Exit(originalImage); 
         } 
        } 
    }); 
    
  • +0

    는'imagePath' 항상 Parallel.For''에서 동일? – Backs

    +0

    @Backs 아니요. 죄송합니다. 코드를 업데이트하고 지금 확인하십시오. –

    +0

    'cnt' 변수의 사용법이 보이지 않습니다. 그것은 하나의 파일을 14 번 병렬로 업데이트하려고합니다. – Backs

    답변

    1

    DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") - 두 개의 이미지를 1 초 안에 저장할 수 있으며 오류가 발생합니다. 고유 한 파일 이름을 만드십시오. 예를 들어 :

    var filename = DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") + cnt