"跨线程操作无效" - 除此之外,我没有执行跨线程操作。 C#

时间:2015-03-17 06:27:18

标签: c# multithreading

我已经看到很多解决此错误的建议:

  

"类型' 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

谢谢

2 个答案:

答案 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();}));