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为什么?
这确实有用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.