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

0x4*_*9D1 0 wpf controls multithreading dispatcher

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

Dispatcher.Invoke((ThreadStart)delegate
            {
              //some code that uses controls from UI
            });
Run Code Online (Sandbox Code Playgroud)

我什么时候应该使用这样的代码而不是Dispatcher.Invoke/BeginInvoke为什么?

Jon*_*eet 6

确实有用Dispatcher.Invoke- 它不是"而不是".该代码仅用于ThreadStart告诉编译器将匿名方法转换为的委托类型.

它相当于:

ThreadStart tmp = delegate
{
    // Code
};
Dispatcher.Invoke(tmp);
Run Code Online (Sandbox Code Playgroud)

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

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

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

public static void InvokeAction(this Dispatcher dispatcher, Action action)
{
    dispatcher.Invoke(action);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

foo.Dispatcher.InvokeAction(() => { /* stuff */ });
Run Code Online (Sandbox Code Playgroud)

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