2017-10-15 9 views
1

J'utilise la boucle Parallel.For pour traiter certaines images. Lorsque je tente de sauver l'image, parfois je reçois un exception-L'image ne parvient pas à enregistrer dans la boucle Parallel.For

une erreur générique est produite dans GDI +

Certaines images obtient enregistre alors cette exception vient au hasard après avoir sauvé quelques fichiers.

  • J'ai essayé assigner l'objet image bitmap d'origine à une autre image bitmap, puis l'enregistrer
  • essayé d'utiliser Monitor.Enter pour synchroniser entre l'enregistrement des fichiers

Ci-dessous mon code-

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' est toujours le même dans' Parallel.For'? – Backs

+0

@Backs Non. Pardon. J'ai mis à jour le code, vérifiez maintenant. –

+0

Je ne vois pas l'utilisation de la variable 'cnt'. Il semble, vous essayez de mettre à jour un fichier 14 fois en parallèle – Backs

Répondre

1

DateTime.Now.ToString("dd-MM-yyyy_hh.mm.ss") - deux images peuvent être enregistrées en une seconde, vous obtiendrez une erreur. Créez plus de nom de fichier unique. Par exemple:

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