2009-09-08 4 views
6

У меня есть вызов метода, который возвращает UIElement, который я вызываю, используя Dispatcher, ниже приведен код.WPF Dispatcher Invoke возвращаемое значение всегда null

Однако возвращаемое значение Dispatcher invoke всегда равно 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))); 

Edit: ThreadStart бросил меня - это не многопоточный. Что вы пытаетесь выполнить с помощью этого примера кода?

+1

Это будет работать, но мне кажется более чистым использовать Func , как описано в других ответах. –

+1

Ну на самом деле Dispatcher.Invoke ждет завершения потока, Dispatcher.BeginInvoke не ... – Zenuka

7

Это потому, что ThreadStart не имеет тип возвращаемого значения (void()).

Попробуйте вместо этого:

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

documentation для Dispatcher.Invoke состояния возвращаемое значение «Возвращаемое значение из делегата быть вызван или пустая ссылка (Nothing в Visual Basic), если делегат не имеет возвращаемого значения «. Поскольку делегат ThreadStart, который вы используете, недействителен, вам необходимо использовать Func<T> или пользовательский делегат с возвращаемым значением.

Смежные вопросы