&引用;对象当前正在其他地方使用";,锁定代码无法解决问题。C#
陶,请看我的评论。我最初关于多个间歇性错误的问题没有得到任何答案,只有一条评论,也许一个问题的信息太多了。因此,我认为最好将其分解为单独的问题 我的主要问题是“对象当前正在其他地方使用”。我在这里读了很多关于堆栈溢出的错误,锁定有问题的代码似乎是解决方法。也许我锁错了,或者可能有其他问题,但是锁对我不起作用,所以我很感激你的意见 我的代码设计用于更改示例pictureBox的颜色,有几个示例pictureBox,用户可以决定将哪个示例颜色更改应用于其原始图像&引用;对象当前正在其他地方使用";,锁定代码无法解决问题。C#,c#,locking,picturebox,C#,Locking,Picturebox,陶,请看我的评论。我最初关于多个间歇性错误的问题没有得到任何答案,只有一条评论,也许一个问题的信息太多了。因此,我认为最好将其分解为单独的问题 我的主要问题是“对象当前正在其他地方使用”。我在这里读了很多关于堆栈溢出的错误,锁定有问题的代码似乎是解决方法。也许我锁错了,或者可能有其他问题,但是锁对我不起作用,所以我很感激你的意见 我的代码设计用于更改示例pictureBox的颜色,有几个示例pictureBox,用户可以决定将哪个示例颜色更改应用于其原始图像 private object loc
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语句。我只是认为我没有正确地实现锁。因此,我原来的问题。然而,事实证明,锁通常不起作用。我想我已经找到了有效的方法,一旦我确认我是正确的,我会继续跟进。谢谢