我已经看到很多解决此错误的建议:
"类型' System.InvalidOperationException'的例外情况发生在System.Windows.Forms.dll中但未在用户代码中处理
附加信息:跨线程操作无效:控制' pictureBox4'从其创建的线程以外的线程访问。"
唯一的问题是,我的问题并不适用于我所见过的解决方案。这是不跨线程操作。这是代码:
private void green()
{
// declare initial variables
int xGreen = 64;
// Get bitmap from picturebox
Bitmap bmp = (Bitmap)pictureBox4.Image;
// search through each pixel via x, y coordinates, examine and make changes. Dont let values exceed 255 or fall under 0.
for (int y = 0; y < bmp.Height; y++)
for (int x = 0; x < bmp.Width; x++)
{
Color c = bmp.GetPixel(x, y);
int myRed = c.R, myGreen = c.G, myBlue = c.B;
myGreen += xGreen;
if (myGreen > 255)
myGreen = 255;
bmp.SetPixel(x, y, Color.FromArgb(255, myRed, myGreen, myBlue));
}
// assign the new bitmap to the picturebox
pictureBox4.Image = (Bitmap)bmp;
pictureBox4.Refresh();
}
pictureBox4.Image
运行正常。 pictureBox4.Refresh()
会触发错误的错误。 picturebox4
在其创建的表单上使用。
导致此错误触发的原因是什么?在代码的其他区域使用pictureBox4.Refresh()
可以正常工作。
顺便说一下,我已经远离了这段代码了,但我完全打算更新它以使用lockbits
。
谢谢
答案 0 :(得分:4)
您正在尝试在非UI线程中更新UI。您可以通过使用以下代码将pictureBox4.Refresh()或其他类似的访问代码更改为以下代码来解除此异常:
pictureBox4.InvokeIfRequired(() =>
{
// Do anything you want with the control here
pictureBox4.Refresh();
});
答案 1 :(得分:0)
我认为你在非主线程中调用更新UI控件。 如果是这样,您可以使用this.Invoke为您询问主线程更新控件。 类似的东西:
this.Invoke(new MethodInvoker(delegate{pictureBox4.Image = (Bitmap)bmp;
pictureBox4.Refresh();}));
或异步形式:
this.BeginInvoke(new MethodInvoker(delegate{pictureBox4.Image = (Bitmap)bmp;
pictureBox4.Refresh();}));