2017-10-15 83 views
1

我正在使用Parallel.For循環來處理一些圖像。當我嘗試保存圖像,有時我得到了GDI發生exception-圖像無法保存在Parallel.For循環

一般性錯誤+

一些圖像得到保存,然後保存一些文件後,該異常來隨機。

  • 我試圖分配原來的位圖圖像對象到不同的位圖圖像,然後將其保存
  • 使用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

@返回沒有。抱歉。我更新了代碼,現在檢查。 –

+0

我沒有看到'cnt'變量的使用。看起來,你試圖並行更新一個文件14次 – Backs

回答

1

DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") - 兩個圖像可以在一秒內保存,你會得到一個錯誤。創建更多獨特的文件名 例如:

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