【问题标题】:System.InvalidOperationException with tasks in C#System.InvalidOperationException 与 C# 中的任务
【发布时间】:2014-08-02 22:27:23
【问题描述】:

我正在尝试通过使用任务 (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);

感谢任何关于如何解决此问题的想法。

【问题讨论】:

  • 当你发现自己用new Bitmap(1, 1)这样的无意义对象初始化变量时,想:一定有更好的方法。

标签: c# parallel-processing task


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,但是我应该在哪里处理呢?目前我在循环之后处理它。
  • @M0HS3N 保存然后丢弃。
猜你喜欢
  • 1970-01-01
  • 2019-01-10
  • 2013-03-02
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多