2009-09-08 9 views
6

Mam wywołanie metody, która zwraca UIElement, które wywołuję za pomocą Dispatcher, poniżej jest kod.Dyspozytor WPF Wywołanie wartości zwracanej jest zawsze zerowe

Jednak wartość zwracana wywołania Dispatcher jest zawsze NULL, jakieś pomysły?

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; 
} 

Odpowiedz

7

D'oh, oto jak to zrobić, co chce zrobić:

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

Edit: ThreadStart wyrzucił mnie - to nie jest wielowątkowe. Co próbujesz osiągnąć za pomocą tej próbki kodu?

+1

To zadziała, ale wydaje mi się, że korzystanie z Func jest czystsze, jak opisano w innych odpowiedziach. –

+1

Dobrze faktycznie Dispatcher.Invoke czeka na zakończenie wątku, Dispatcher.BeginInvoke nie ... – Zenuka

7

To dlatego ThreadStart nie posiada typ zwracany (void()).

Spróbuj to zamiast:

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

documentation dla Dispatcher.Invoke stany zwracana jest wartość „Wartość zwracana z delegata jest wywoływany lub null odniesienia (Nothing w języku Visual Basic), jeżeli pełnomocnik nie ma żadnej wartości zwracanej . " Ponieważ delegat ThreadStart, którego używasz, jest nieważny, musisz użyć Func<T> lub niestandardowego delegata z wartością zwracaną.