使用匿名方法调用WPF Dispatcher
本文关键字:调用 WPF Dispatcher 方法 | 更新日期: 2023-09-27 17:58:23
我刚刚在C#.Net 4.0 WPF后台线程中意识到这不起作用(编译器错误):
Dispatcher.Invoke(DispatcherPriority.Normal, delegate()
{
// do stuff to UI
});
从一些例子中,我发现它必须这样铸造:(Action)delegate()
。然而,在其他示例中,它被广播到其他类,例如System.Windows.Forms.MethodInvoker
。
有人能告诉我上面的例子到底出了什么问题吗?我也试着用其他方法复制它,但它总是在没有铸造的情况下工作:
delegate void MyAction();
void Method1(MyAction a) {
// do stuff
}
void Method2(Action a) {
// do stuff
}
void Tests()
{
Method1(delegate()
{
// works
});
Method2(delegate()
{
// works
});
Method1(() =>
{
// works
});
Method2(() =>
{
// works
});
Method2(new Action(delegate()
{
// works
}));
new System.Threading.Thread(delegate()
{
// works
}).Start();
}
那么,调用Dispatcher的最佳(最优雅、冗余度较低)方法是什么呢?它有什么特别之处,必须强制执行委托?
我想指出一个比Svick的更干净的代码示例,毕竟我们都喜欢一行代码,不是吗?
Dispatcher.Invoke((Action) delegate { /* your method here */ });
查看Dispatcher.Invoke()
的签名。它不采用Action
或其他特定的委托类型。它采用Delegate
,它是所有委托类型的共同祖先。但不能直接将匿名方法转换为此基类型,只能将其转换为某些特定的委托类型。(同样适用于Lambda和方法组。)
为什么需要Delegate
?因为您可以将接受参数或具有返回值的委托传递给它。
最干净的方法可能是:
Action action = delegate()
{
// do stuff to UI
};
Dispatcher.Invoke(DispatcherPriority.Normal, action);
我使用这个:
Dispatcher.Invoke((Action)(() => YourCodeHere()));
"Delegate"类是abstract
,因此必须为编译器提供从它派生的类型。任何从Delegate派生的类都可以,但Action通常是最合适的。