每个pictureBox_right和pictureBox_left的集合上的以下代码给出了一个错误,该对象在其他地方使用。我想知道如何解决这个问题。
var tempMyObject = JsonConvert.DeserializeObject<MyTestClass>(jsonResult,
new JsonSerializerSettings { Converters = { new MyTestClassConverter() } });
以下是导致错误的代码行:
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;
我的问题是如何解决这个问题。我认为发生的事情是,在某些情况下,我的pictureBox_rightconnectivity.Image和pictureBox_leftconnectivity.Image仍然被另一个线程访问。另一个线程进来然后尝试设置该图像。我想知道如何解决这个问题?正如您所看到的,我最初的尝试是尝试复制Bitmap复制对象中的图像。然后使用它来设置pictureBox_left和pictureBox_right。但是我发现这仍然把对象丢在其他地方使用错误。
答案 0 :(得分:0)
您的代码至少存在一些问题。
首先,不允许从创建它们的线程以外的线程访问控件(如PictureBox
)(希望是GUI线程)。因此,即使您使用锁定,从多个线程获取/设置pictureBox_rightConnectivity.Image
也是非法的。
此外,除非每次都锁定同一个对象,否则锁定没有任何好处。在您的第一个代码块中,您将锁定lockObject
。在第二个代码块中,您将锁定ArduinoUno_v1.Properties.Resources.on_button
。这些是同一个对象吗?如果没有,你就不会得到“互斥”的效果,因为没有什么能阻止一个线程获得lockObject
上的锁定而另一个线程锁定ArduinoUno_v1.Properties.Resources.on_button
。
这些只是我立即看到的几件事。可能还有其他线程错误。一般来说,线程是你应该做的事情,如果你确定(基于仔细研究)你知道你在做什么,因为如果你完全不确定,你可能有bug,而且它们经常是bug很难再现和追踪。