使用 Paraller.For 时对象当前正在其他地方使用错误
Object is currently in use somewhere else error when using Paraller.For
我正在尝试使用下面的代码对图像进行并行化操作,但出现 One or more errors occurred
错误。
查看内部异常,我可以看到发生了错误 {"Object is currently in use elsewhere."}
。
注意:CoverImage
和SecretImage
是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++;
}
);
我试过使用这样的互斥量:
mutex.WaitOne();
StegoImage.SetPixel(x, y, Color.FromArgb(255, r, g, b));
mutex.ReleaseMutex();
但仍然没有用(我得到同样的错误)。
您似乎在尝试使用来自非 UI 线程的图像 API。这是个坏主意。
我建议您将图像复制到 UI 线程上的字节数组,然后 运行 您的并行 for 循环会改变数组,然后从字节数组重新创建图像。
我正在尝试使用下面的代码对图像进行并行化操作,但出现 One or more errors occurred
错误。
查看内部异常,我可以看到发生了错误 {"Object is currently in use elsewhere."}
。
注意:CoverImage
和SecretImage
是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++;
}
);
我试过使用这样的互斥量:
mutex.WaitOne();
StegoImage.SetPixel(x, y, Color.FromArgb(255, r, g, b));
mutex.ReleaseMutex();
但仍然没有用(我得到同样的错误)。
您似乎在尝试使用来自非 UI 线程的图像 API。这是个坏主意。
我建议您将图像复制到 UI 线程上的字节数组,然后 运行 您的并行 for 循环会改变数组,然后从字节数组重新创建图像。