2009-09-08 21 views
6

Ho una chiamata a un metodo che restituisce un UIElement che chiamo utilizzando lo Dispatcher, di seguito è riportato il codice.WPF Dispatcher Invoke il valore restituito è sempre nullo

Tuttavia il valore restituito del richiamo di Dispatcher è sempre NULL, qualche idea?

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

risposta

7

D'oh, ecco come fare ciò che si sta cercando di fare:

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

Edit: Il ThreadStart mi ha buttato fuori - questo non è multithreaded. Cosa stai cercando di ottenere con questo esempio di codice ??

+1

Questo funzionerà, ma mi sembra più pulito usare Func come descritto in altre risposte. –

+1

In realtà Dispatcher.Invoke attende il completamento del thread, Dispatcher.BeginInvoke non ... – Zenuka

7

È perché ThreadStart non hai un tipo di ritorno (void()).

Prova a modificare:

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

Il documentation per Dispatcher.Invoke stati il ​​valore di ritorno è "Il valore restituito dal delegato essere invocato o un riferimento null (Nothing in Visual Basic) se il delegato non ha alcun valore di ritorno ". Poiché il delegato ThreadStart è vuoto, è necessario utilizzare un Func<T> o un delegato personalizzato con un valore restituito.

Problemi correlati