2010-01-22 10 views
3

이미지를 표시하는 WPF 컨트롤을 빌드했습니다. 이제 저는 그 이미지를 매우 빠른 속도로 바꾸고 싶습니다. 이미지를 저장하는 ImageContainer 클래스를 만들고 변경시 이미지를 업데이트하는 ChangedEventHandler가 있습니다. 실행WPF의 TargetInvocationException에서 이미지 업데이트

코드는 다음과 같습니다

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 메서드에서 해당 속성을 변경해 보셨습니까?

Image/List <ImageSource>/Timer 조합으로 시도해 보았지만 꽤 잘 작동합니다.

관련 문제