带有C#中任务的System.InvalidOperationException

时间:2014-08-02 22:27:23

标签: c# parallel-processing task

我正在尝试使用任务(Parallel.foreach)使代码更快。这是我更新的代码:

int intImageW, intImageH;
Bitmap bmpDest = new Bitmap(1, 1);
DateTime creationTime, lastWriteTime, lastAccessTime;

Parallel.ForEach(strarrFileList, strJPGImagePath =>
{
      creationTime = File.GetCreationTime(strJPGImagePath);
      lastWriteTime = File.GetLastWriteTime(strJPGImagePath);
      lastAccessTime = File.GetLastAccessTime(strJPGImagePath);

      using (Bitmap bmpOrig = new Bitmap(strJPGImagePath))
      {
          intImageW = bmpOrig.Width;
          intImageH = bmpOrig.Height;

          if ((intImageW > intImageH) && (intImageW > intLongSide))
          {
              intImageH = (int)((double)intImageH / ((double)intImageW / (double)intLongSide));
              intImageW = intLongSide;
          }
         else if ((intImageH > intImageW) && (intImageH > intLongSide))
         {
              intImageW = (int)((double)intImageW / ((double)intImageH / (double)intLongSide));
              intImageH = intLongSide;
          }
         else if ((intImageH == intImageW) && (intImageW > intLongSide))
         {
              intImageH = intLongSide;
              intImageW = intLongSide;
          }
         else
             mSplash("This photo (" + Path.GetFileName(strJPGImagePath) + ") is smaller than the desired size!");

         bmpDest = new Bitmap(bmpOrig, new Size(intImageW, intImageH));
      }
      bmpDest.Save(strJPGImagePath, jgpEncoder, myEncoderParameters);

      File.SetCreationTime(strJPGImagePath, creationTime);
      File.SetLastWriteTime(strJPGImagePath, lastWriteTime);
      File.SetLastAccessTime(strJPGImagePath, lastAccessTime);
});

然而,它给了我这个例外:

System.Drawing.dll中发生了'System.InvalidOperationException'类型的异常,但未在用户代码中处理 附加信息:对象目前在其他地方使用。 如果存在此异常的处理程序,则可以安全地继续该程序。

此行发生异常:

bmpDest.Save(strJPGImagePath, jgpEncoder, myEncoderParameters);

对于如何解决这个问题的任何想法表示赞赏。

1 个答案:

答案 0 :(得分:2)

您的所有任务访问同一共享位图bmpDest

将其定义移动到Parallel.ForEach块,以便每个任务都可以使用自己的位图。

Parallel.ForEach(strarrFileList, strJPGImagePath =>
{
     Bitmap bmpDest = new Bitmap(1, 1);
     ........
});