C# 如何修复线程错误
以下关于每个pictureBox_right和pictureBox_left集合的代码告诉我一个错误,该对象正在其他地方使用。我在想我该怎么解决这个问题C# 如何修复线程错误,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,以下关于每个pictureBox_right和pictureBox_left集合的代码告诉我一个错误,该对象正在其他地方使用。我在想我该怎么解决这个问题 private Bitmap pictureBox_right { get { lock (lockObject) return (Bitmap)this.pictureBox_rightConnectivity.Image.DeepClone();
private Bitmap pictureBox_right
{
get
{
lock (lockObject)
return (Bitmap)this.pictureBox_rightConnectivity.Image.DeepClone();
}
set
{
lock (lockObject)
{
pictureBox_rightConnectivity.Image = value.DeepClone();
}
}
}
private Bitmap pictureBox_left
{
get
{
lock (lockObject)
return (Bitmap)this.pictureBox_leftConnectivity.Image.DeepClone();
}
set
{
lock (lockObject)
{
this.pictureBox_leftConnectivity.Image = value.DeepClone();
}
}
}
以下是导致错误的代码行:
Bitmap copy;
lock (ArduinoUno_v1.Properties.Resources.on_button)
{
copy = new Bitmap(ArduinoUno_v1.Properties.Resources.on_button);
pictureBox_rightConnectivity.Image = new Bitmap(ArduinoUno_v1.Properties.Resources.on_button);
//pictureBox_right = ArduinoUno_v1.Properties.Resources.on_button;
}
pictureBox_right = copy;
这是错误的另一部分,本质上是相同的,但对左边的图片框是一样的
Bitmap copy;
lock (ArduinoUno_v1.Properties.Resources.on_button)
{
copy = new Bitmap(ArduinoUno_v1.Properties.Resources.on_button);
pictureBox_leftConnectivity.Image = new Bitmap(ArduinoUno_v1.Properties.Resources.on_button); // making a copy so we don't get into access problems
// pictureBox_left = ArduinoUno_v1.Properties.Resources.on_button;
}
pictureBox_left = copy;
我的问题是如何解决这个问题。我认为在某些情况下,我的pictureBox_rightconnectivity.Image和pictureBox_leftconnectivity.Image仍被另一个线程访问。当另一个线程进入并尝试设置该图像时。我在想我该怎么解决这个问题?正如您所见,我最初的尝试是尝试在位图复制对象中复制图像。然后用它来设置pictureBox_左和pictureBox_右。但是我发现这仍然抛出了对象在别处使用的错误。您的代码至少有几个问题 首先,不允许从创建控件的线程(希望是GUI线程)以外的线程访问控件(如
PictureBox
)。因此,从多个线程获取/设置pictureBox\u rightConnectivity.Image是非法的,即使您使用的是锁
此外,除非每次都锁定同一对象,否则锁定没有任何好处。在第一个代码块中,锁定的是lockObject
。在第二个代码块中,您锁定了ArduinoUno\u v1.Properties.Resources.on\u按钮
。这些是同一个物体吗?如果没有,则不会得到“互斥”效果,因为没有任何东西可以阻止一个线程在lockObject
上获得锁,而另一个线程在ArduinoUno\u v1.Properties.Resources.on\u按钮上保持锁
这些只是我马上看到的几件事。可能还有其他线程错误。一般来说,只有在你确信(基于仔细的研究)你知道你在做什么的情况下,你才应该做线程,因为如果你完全不确定,你可能有bug,而且它们通常是很难复制和追踪的bug