2012-07-03 2 views
4

enter image description here Используя следующий код, мы получили ошибку «Объект используется в настоящее время в других местах»Объект используется в настоящее время в другом месте - когда image.save

private void CaptureDone(System.Drawing.Bitmap e) 
     { 
      try 
      { 
       this.pictureBox.Image = e; 
       if (isSending) 
        ThreadPool.QueueUserWorkItem(new WaitCallback(SendVideoBuffer), pictureBox.Image); 
      } 
      catch (Exception) { } 
     } 

    void SendVideoBuffer(object bufferIn) 
      { 
    TcpClient tcp = new TcpClient(ConfigurationSettings.AppSettings[0].ToString(), 6000); 
          NetworkStream ns = tcp.GetStream(); 
          if (ns != null) 
          { 
           System.Drawing.Image buffer = (System.Drawing.Image)bufferIn; 
           buffer.Save(ns, System.Drawing.Imaging.ImageFormat.Jpeg);// error comes here 
           ns.Close(); 
           tcp.Close(); 
          } 
      } 

Пожалуйста, дайте предложения.

+0

где определяется 'bufferIn'? всегда хорошая идея использовать блок 'using' при работе с' streams'. – Mayank

+0

@Mayank BufferIn - это объект. обновлен код. Пожалуйста, проверьте –

+0

@Mayank - По-прежнему с той же ошибкой –

ответ

3

GDI + изображения не являются потокобезопасными, вам необходимо закрепить замок на объекте.

void SendVideoBuffer(object bufferIn) 
    { 

var tcp = new TcpClient(ConfigurationSettings.AppSettings[0].ToString(), 6000); 
        var ns = tcp.GetStream(); 
        if (ns != null) 
        { 
         var buffer = (System.Drawing.Image)bufferIn; 
         lock(buffer) 
          buffer.Save(ns, System.Drawing.Imaging.ImageFormat.Jpeg); 
         ns.Close(); 
         tcp.Close(); 
     } 
} 
+0

'if (picturebox.InvokeRequired) {pictureBox.Invoke (новый MethodInvoker (() => SendVideoBuffer (picturebox.Image))); } else SendVideoBuffer (picturebox.Image); ' – Mayank

+0

это ответ на вопрос – Mayank

0

Я столкнулся с таким исключением и получил на нем больше оснований.

Большинство причин этого исключения вызвано многопоточным процессом, в котором мы пытаемся управлять одним и тем же глобальным изображением.

Это объясняет, почему это исключение происходит: «С WinForms это обычно означает, что происходит рекурсивный Graphics.GetHdc. GetHdc должен соответствовать ReleaseHdc перед любым другим GetHdc. Рекурсивный означает, что у вас есть что-то вроде GetHdc-> GetHdc -> ReleaseHdc-> ReleaseHdc, а не GetHdc-> ReleaseHdc-> GetHdc-> ReleaseHdc. Другая возможность заключается в отсутствии недостающего вызова ReleaseHdc (то есть GetHdc-> GetHdc-> ReleaseHdc) ".

Глубоко в изображение.Сохраненный метод больше, он вызовет метод GetHdc-> ReleaseHdc. Кроме того, я думаю, что если мы попытаемся получить методы image.width или image.Clone, он также вызовет метод GetHdc.

Итак, будьте осторожны при попытке использовать глобальное изображение в потоках. Большинство операций не являются потокобезопасными.

Смежные вопросы