2010-01-22 2 views
3

Я создал элемент управления WPF, который отображает изображение. Теперь я хотел бы изменить это изображение с очень высокой скоростью. Я построил класс ImageContainer, который содержит изображение, и имеет ChangedEventHandler, который обновляет изображение в моем элементе управления при изменении.TargetInvocationException при обновлении изображения в WPF

код, который выполняется выглядит следующим образом:

videoImageThread = new Thread(
      new ThreadStart(
       delegate() 
       { 
        this.VideoCapture.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Normal, 
        new Action(
         delegate() 
         { 

          videoImage.Source = VideoImageContainer.Instance.VideoBitmapSourceImage; 

         } 
       )); 
       } 
     )); 


private void Instance_VideoRefresh() 
    { 
     if (VideoImageContainer.Instance.VideoImage != null) 
     { 
      lock (videoImageSetLock) 
      { 
       videoImageThread.Start(); 
      } 
     } 
    } 

Этот код бросает System.Reflection.TargetInvocationException, что я делаю не так?

+0

Может быть, потому что вы обращаетесь к диспетчеру, который принадлежит другому потоку? – Andres

+0

Но это не так? Я не могу обновить элемент управления из потока, отличного от потока элементов управления, если я сделаю это, я получаю другое исключение. Вот почему у меня этот код, он вызван некоторым рабочим потоком и ссылками на поток управления. –

+2

Посмотрите на свойство InnerException исключения, чтобы найти реальную причину. –

ответ

1

Мне кажется, что вы вызываете поток, чтобы вызвать поток?!

вы пробовали вызова действия на диспетчеру непосредственно, как так:

private void Instance_VideoRefresh() 
{ 
    if (VideoImageContainer.Instance.VideoImage != null) 
     this.VideoCapture.Dispatcher.Invoke(
       System.Windows.Threading.DispatcherPriority.Normal, 
       new Action(
        delegate() 
        { 
         videoImage.Source = VideoImageContainer.Instance.VideoBitmapSourceImage; 
        } 
      )); 
} 
0

Вы пробовали просто привязать videoImage.Source к свойству и изменить это свойство в вашем методе Instance_VideoRefresh?

Я уже пробовал это с изображением/списком <ImageSource>/Timer combination, и он работает очень хорошо.

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