&引用;对象当前正在其他地方使用";,锁定代码无法解决问题。C#

&引用;对象当前正在其他地方使用";,锁定代码无法解决问题。C#,c#,locking,picturebox,C#,Locking,Picturebox,陶,请看我的评论。我最初关于多个间歇性错误的问题没有得到任何答案,只有一条评论,也许一个问题的信息太多了。因此,我认为最好将其分解为单独的问题 我的主要问题是“对象当前正在其他地方使用”。我在这里读了很多关于堆栈溢出的错误,锁定有问题的代码似乎是解决方法。也许我锁错了,或者可能有其他问题,但是锁对我不起作用,所以我很感激你的意见 我的代码设计用于更改示例pictureBox的颜色,有几个示例pictureBox,用户可以决定将哪个示例颜色更改应用于其原始图像 private object loc

陶,请看我的评论。我最初关于多个间歇性错误的问题没有得到任何答案,只有一条评论,也许一个问题的信息太多了。因此,我认为最好将其分解为单独的问题

我的主要问题是“对象当前正在其他地方使用”。我在这里读了很多关于堆栈溢出的错误,锁定有问题的代码似乎是解决方法。也许我锁错了,或者可能有其他问题,但是锁对我不起作用,所以我很感激你的意见

我的代码设计用于更改示例pictureBox的颜色,有几个示例pictureBox,用户可以决定将哪个示例颜色更改应用于其原始图像

private object lockObject = new object();    

private void red()
{
        // declare initial variables 
        int xRed = 64;

        // Work around for "Cross-thread operation not valid" error.  This may be a VS issue, not an actual coding error. 
        if (trkColor.InvokeRequired)
            trkColor.Invoke(new MethodInvoker(delegate { xRed = trkColor.Value; }));
        else
            xRed = trkColor.Value;

        // Get bitmap from picturebox
        Bitmap bmp = (Bitmap)pictureBox1.Image;

        lock (lockObject)
        {

        // 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;
                myRed += xRed;
                if (myRed > 255)
                    myRed = 255;
                bmp.SetPixel(x, y, Color.FromArgb(255, myRed, myGreen, myBlue));
            }

        // assign the new bitmap to the picturebox
        pictureBox1.Image = (Bitmap)bmp;
        }
}   
private object lockObject=new object();
私人空间红色()
{
//声明初始变量
int xRed=64;
//解决“交叉线程操作无效”错误。这可能是VS问题,而不是实际的编码错误。
if(trkColor.invokererequired)
调用(新方法调用程序(委托{xRed=trkColor.Value;}));
其他的
xRed=色值;
//从picturebox获取位图
位图bmp=(位图)pictureBox1.Image;
锁定(锁定对象)
{
//通过x、y坐标搜索每个像素,检查并进行更改。不要让值超过255或低于0。
对于(int y=0;y255)
myRed=255;
bmp.SetPixel(x,y,Color.FromArgb(255,myRed,myGreen,myBlue));
}
//将新位图指定给picturebox
pictureBox1.Image=(位图)bmp;
}
}   

TaW:我想花点时间感谢您特意为我演示了锁位代码。我没有在我的项目中实现它的原因是,这是一门C#入门课,我需要能够向我的教授解释每一行代码。我只是还没到用锁具就能做到的地步。课程结束后,我将继续为我自己的使用而工作,我将使用lockbits代码。如果你对这个新问题有任何想法,请随时告诉我,你一直都是一个巨大的帮助感谢您尝试移动线位图bmp=(位图)pictureBox1.Image;在lock语句中?是的,只是尝试了一下,没有更改,得到了相同的错误。谢谢你的建议。我很想知道为什么你首先会有这个lock语句,因为无论如何只有UI线程应该操作控件。我添加了lock语句,因为我读到的关于stackoverflow错误的每个问题,还有很多问题,都说要添加一个lock语句。我只是认为我没有正确地实现锁。因此,我原来的问题。然而,事实证明,锁通常不起作用。我想我已经找到了有效的方法,一旦我确认我是正确的,我会继续跟进。谢谢