6

我调用了一个方法,该方法返回UIElement我使用 调用的a Dispatcher,下面是代码。

但是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;
}
4

3 回答 3

7

这是因为ThreadStart没有返回类型 ( void())。

试试这个:

UIElement retVal = slide.Dispatcher.Invoke(new Func<UIElement>( () => imageService.GenerateProxyImage(slide))); 
于 2009-09-08T13:36:32.933 回答
7

D'oh,这是您尝试做的事情的方法:

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

编辑: ThreadStart 让我失望了——这不是多线程的。你想用这个代码示例完成什么?

于 2009-09-08T13:59:34.043 回答
1

声明返回值的文档Dispatcher.Invoke“如果委托没有返回值,则来自被调用的委托或空引用(Visual Basic 中的无)的返回值”。由于ThreadStart您使用的委托是无效的,因此您需要使用Func<T>具有返回值的委托或自定义委托。

于 2009-09-08T13:44:46.403 回答