2017-01-10 2 views
0

Следующий код в наборе каждого изображенияBox_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 все еще доступен другим потоком. Где, когда приходит другой поток, а затем пытается установить это изображение. Мне было интересно, как я могу это исправить? Как вы можете видеть, моя первоначальная попытка состояла в том, чтобы попытаться скопировать изображение в объект копии Bitmap. а затем используйте это, чтобы установить pictureBox_left и pictureBox_right. Но я обнаружил, что это все еще бросает объект, который используется в другом месте.

ответ

0

Есть, по крайней мере, несколько проблем с вашим кодом.

Во-первых, не допускается доступ к элементам управления (например, PictureBox) из потока, отличного от потока, на котором они были созданы (надеюсь, что поток GUI). Таким образом, получение/установка pictureBox_rightConnectivity.Image из нескольких потоков является незаконным, даже если вы используете блокировки.

Кроме того, блокировка не приносит пользы, если вы не блокируете один и тот же объект каждый раз. В первом блоке кода вы блокируете lockObject. Во втором блоке кода вы блокируете ArduinoUno_v1.Properties.Resources.on_button. Это тот же объект? Если нет, вы не получите «взаимоисключающий» эффект, потому что ничто не удерживает один поток от получения блокировки на lockObject, а другой удерживает блокировку на ArduinoUno_v1.Properties.Resources.on_button.

Это всего лишь пара вещей, которые я вижу сразу. Вероятно, есть и другие ошибки. В общем, потоки - это то, что вам нужно делать, только если вы уверены (на основе тщательного изучения), что знаете, что делаете, потому что, если вы вообще не уверены, у вас, вероятно, есть ошибки, и они часто являются ошибками, которые трудно воспроизводить и отслеживать.