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();