Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象当前正在其他地方使用。使用Paraller.For时出错_C#_Parallel.for - Fatal编程技术网

C# 对象当前正在其他地方使用。使用Paraller.For时出错

C# 对象当前正在其他地方使用。使用Paraller.For时出错,c#,parallel.for,C#,Parallel.for,我正在尝试使用下面的代码对图像执行并行操作,但我得到一个错误,出现了一个或多个错误 查看内部异常,我可以看到错误{“对象当前正在其他地方使用。”}已经发生 注意:CoverImage和securimage是Bitmaps Parallel.For(0, CoverImage.Width, x => { for (int y = 0; y < CoverImage.Height; y++, SecretImageHeight++

我正在尝试使用下面的代码对图像执行并行操作,但我得到一个
错误,出现了一个或多个
错误

查看内部异常,我可以看到错误
{“对象当前正在其他地方使用。”}
已经发生

注意:
CoverImage
securimage
Bitmap
s

 Parallel.For(0, CoverImage.Width, x =>
            {
                for (int y = 0; y < CoverImage.Height; y++, SecretImageHeight++)
                {
                    Color coverImagesPixel = CoverImage.GetPixel(x, y);
                    Color secretImagesPixel = SecretImage.GetPixel(SecretImageWidth, SecretImageHeight);

                    int r = (coverImagesPixel.R & coverImageMask) + ((secretImagesPixel.R >> shift) & secretImageMask);
                    int g = (coverImagesPixel.G & coverImageMask) + ((secretImagesPixel.G >> shift) & secretImageMask);
                    int b = (coverImagesPixel.B & coverImageMask) + ((secretImagesPixel.B >> shift) & secretImageMask);

                    StegoImage.SetPixel(x, y, Color.FromArgb(255, r, g, b));
                }
                SecretImageHeight = 0;
                SecretImageWidth++;
            }
            );

但是仍然没有用(我得到了相同的错误)。

看起来您正在尝试从非UI线程使用图像API。那是个坏主意


我建议您将映像复制到UI线程上的一个字节数组,然后运行并行for循环,该循环将改变数组,然后从字节数组重新创建映像。

CoverImage和SecretImage是什么类型?它们是否在其他应用程序中使用?在互斥锁中包装对它们的访问时会发生什么?它们可能也会导致问题。如果遵循异常,是哪一行导致了问题?我猜
securimage
CoverImage
不是线程安全的。@thorkia:它们是位图类型。@弗林德伯格:它只是突出了平行线。对于布洛克来说altogether@Hossein您是否尝试过更改为非并行循环,然后在循环中添加断点并遍历它以查看引发异常的位置?我怀疑Jon Skeet是对的,你要么将图像复制到bytearray,要么在UI线程上分配对它们的访问权限,如果这是WPF,则可能是,另一个选项是使用dispatcher并调用UI上的调用thread@thorkia:但是OP故意使用了
并行。对于
并行化工作,将每个图像通过UI线程瓶颈将无法实现这一点。
mutex.WaitOne();
StegoImage.SetPixel(x, y, Color.FromArgb(255, r, g, b));
mutex.ReleaseMutex();