当我需要从后台线程访问一些UI元素时,我通常使用Dispatcher.Invoke
。最近我不得不改变其他人的书面资料,我看到了他用以下结构完成的相同任务:
Dispatcher.Invoke((ThreadStart)delegate
{
//some code that uses controls from UI
});
我何时应该使用此类代码代替Dispatcher.Invoke/BeginInvoke
以及为什么?
答案 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
。