2009-09-08 7 views
6

J'ai un appel à une méthode qui renvoie un UIElement que j'appelle en utilisant le Dispatcher, ci-dessous est le code.WPF Dispatcher Invoke la valeur de retour est toujours null

Cependant, la valeur de retour de l'appel Dispatcher est toujours NULL, des idées?

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

Répondre

7

D'oh, voici comment faire ce que vous essayez de faire:

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

Edit: Le ThreadStart me jeta - ce n'est pas multithread. Qu'est-ce que vous essayez d'accomplir avec cet exemple de code ??

+1

Cela fonctionnera, mais il me semble plus propre d'utiliser Func comme décrit dans les autres réponses. –

+1

Bien en fait Dispatcher.Invoke attend que le thread se termine, Dispatcher.BeginInvoke ne ... – Zenuka

7

C'est parce que ThreadStart n'a pas un type de retour (void()).

Essayez ceci:

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

Le documentation pour Dispatcher.Invoke états la valeur de retour est « La valeur de retour du délégué étant invoqué ou une référence null (Nothing en Visual Basic) si le délégué n'a pas de valeur de retour " Étant donné que le délégué ThreadStart que vous utilisez est vide, vous devez utiliser un Func<T> ou un délégué personnalisé avec une valeur de retour.

Questions connexes