2017-10-15 8 views
1

私はいくつかのイメージを処理するためにParallel.Forループを使用しています。私は画像を保存しようとすると、時々、私はいくつかの画像を一般的なエラーがGDI +イメージはParallel.Forループで保存されません。

を発生

exception-を取得する取得保存し、その後、この例外は、いくつかのファイルを保存した後、ランダムに来ます。

  • は、私は私のコード - された別のビットマップ画像に元のビットマップイメージオブジェクトを割り当て、その後ファイルの下

を保存間で同期する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'変数の使用法は表示されません。あなたは1つのファイルを14回並列に更新しようとしています。 – Backs

    答えて

    1

    DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") - 2つの画像を1秒で保存できますが、エラーが発生します。より一意のファイル名を作成します。たとえば :

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

    関連する問題