Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何修复线程错误_C#_Multithreading_Thread Safety - Fatal编程技术网

C# 如何修复线程错误

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();

以下关于每个pictureBox_right和pictureBox_left集合的代码告诉我一个错误,该对象正在其他地方使用。我在想我该怎么解决这个问题

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