2009-09-08 2 views
6

Dispatcher을 사용하여 호출하는 UIElement을 반환하는 메서드에 대한 호출이 있습니다. 코드는 아래와 같습니다.WPF Dispatcher Invoke 반환 값은 항상 null입니다.

그러나 Dispatcher 호출의 반환 값은 항상 NULL입니까, 어떤 아이디어입니까?

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var slides = (IList<UIElement>)e.Argument; 
    var bmpSlides = new List<UIElement>(); 
    var imageService = new ImageService(); 
    int count = 0; 

    foreach (UIElement slide in slides) 
    { 
     object retVal = slide.Dispatcher.Invoke(
      new ThreadStart(() => imageService.GenerateProxyImage(slide))); 
     bmpSlides.Add(imageService.GenerateProxyImage(slide)); 
     _backgroundWorker.ReportProgress(count/100 * slides.Count); 
     count++; 
    } 

    e.Result = bmpSlides; 
} 

답변

7

오 D', 여기 당신이 뭘 하려는지 방법은 다음과 같습니다

object retVal; 
slide.Dispatcher.Invoke(new Action(() => retval = imageService.GenerateProxyImage(slide))); 

편집 : ThreadStart이 날을 던졌다 -이 다중 스레드되지 않습니다. 이 코드 샘플로 무엇을하려합니까?

+1

이 작업은 가능하지만 다른 답변에서 설명한대로 Func 을 사용하는 것이 더 깨끗해 보입니다. –

+1

사실 Dispatcher.BeginInvoke는 스레드가 완료 될 때까지 기다립니다. Dispatcher.BeginInvoke는 ... – Zenuka

7

ThreadStart는 반환 형식 (void())를 가지고 있지 않기 때문에 그것은이다.

대신을 시도해보십시오

UIElement retVal = slide.Dispatcher.Invoke(new Func<UIElement>(() => imageService.GenerateProxyImage(slide))); 
1

documentationDispatcher.Invoke에 대한 상태를 반환 값이 "호출되는 대리자의 반환 값이나 Null 참조 (Visual Basic의 경우 Nothing) 인 경우 대리자가 더 리턴 값이없는 경우 . " 사용중인 ThreadStart 대리자가 무효이므로 Func<T> 또는 반환 값이있는 사용자 지정 대리자를 사용해야합니다.

관련 문제