为什么在WPF中使用Dispatcher.Invoke((ThreadStart)委托...?

时间:2011-11-17 09:10:35

标签: wpf multithreading controls dispatcher

当我需要从后台线程访问一些UI元素时,我通常使用Dispatcher.Invoke。最近我不得不改变其他人的书面资料,我看到了他用以下结构完成的相同任务:

Dispatcher.Invoke((ThreadStart)delegate
            {
              //some code that uses controls from UI
            });

我何时应该使用此类代码代替Dispatcher.Invoke/BeginInvoke以及为什么?

1 个答案:

答案 0 :(得分:6)

使用Dispatcher.Invoke - 它不是“而不是”。该代码只是使用ThreadStart来告诉编译器委托类型将匿名方法转换为。

相当于:

ThreadStart tmp = delegate
{
    // Code
};
Dispatcher.Invoke(tmp);

我个人在这里使用Action代替ThreadStart,因为你实际上没有开始一个帖子,但这是一个非常随意的选择。忽略它被称为ThreadStart的事实 - 它只是 一个具有void返回类型且没有参数的委托。

编辑:你必须指定 a 委托类型的原因是编译器无法将匿名函数(即匿名方法或lambda表达式)转换为Delegate,这是Dispatcher.Invoke的参数类型。

一种解决方法是编写扩展方法:

public static void InvokeAction(this Dispatcher dispatcher, Action action)
{
    dispatcher.Invoke(action);
}

然后您可以使用:

foo.Dispatcher.InvokeAction(() => { /* stuff */ });

并且编译器知道将lambda表达式转换为Action