使用匿名方法调用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的最佳(最优雅、冗余度较低)方法是什么呢?它有什么特别之处,必须强制执行委托?

使用匿名方法调用WPF 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通常是最合适的。