如何修复线程错误

时间:2017-01-10 23:36:52

标签: c# multithreading thread-safety

每个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。但是我发现这仍然把对象丢在其他地方使用错误。

1 个答案:

答案 0 :(得分:0)

您的代码至少存在一些问题。

首先,不允许从创建它们的线程以外的线程访问控件(如PictureBox)(希望是GUI线程)。因此,即使您使用锁定,从多个线程获取/设置pictureBox_rightConnectivity.Image也是非法的。

此外,除非每次都锁定同一个对象,否则锁定没有任何好处。在您的第一个代码块中,您将锁定lockObject。在第二个代码块中,您将锁定ArduinoUno_v1.Properties.Resources.on_button。这些是同一个对象吗?如果没有,你就不会得到“互斥”的效果,因为没有什么能阻止一个线程获得lockObject上的锁定而另一个线程锁定ArduinoUno_v1.Properties.Resources.on_button

这些只是我立即看到的几件事。可能还有其他线程错误。一般来说,线程是你应该做的事情,如果你确定(基于仔细研究)你知道你在做什么,因为如果你完全不确定,你可能有bug,而且它们经常是bug很难再现和追踪。