C# 使用匿名方法调用WPF调度程序

C# 使用匿名方法调用WPF调度程序,c#,.net,wpf,delegates,dispatcher,C#,.net,Wpf,Delegates,Dispatcher,我刚刚在C#.Net 4.0 WPF后台线程中意识到这不起作用(编译器错误): 从一些示例中,我发现它必须这样铸造:(Action)delegate()。但是,在其他示例中,它被强制转换到其他类,例如System.Windows.Forms.MethodInvoker 谁能告诉我上面的例子到底出了什么问题?我也尝试用其他方法复制它,但它总是在没有铸造的情况下工作: delegate void MyAction(); void Method1(MyAction a) { // do stu

我刚刚在C#.Net 4.0 WPF后台线程中意识到这不起作用(编译器错误):

从一些示例中,我发现它必须这样铸造:
(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的最佳(最优雅、冗余更少)方法是什么?它有什么特别之处,必须对委托进行强制转换?

请查看签名。它不执行
操作
或其他特定的委托类型。它采用
委托
,这是所有委托类型的共同祖先。但您不能直接将匿名方法转换为此基类型,只能将其转换为某些特定的委托类型。(这同样适用于lambda和方法组。)

为什么需要
委托
?因为您可以向it传递接受参数或具有返回值的委托

最干净的方法可能是:

Action action = delegate()
{
    // do stuff to UI
};

Dispatcher.Invoke(DispatcherPriority.Normal, action);

“Delegate”类是
抽象的
,因此您必须向编译器提供从它派生的类型。从Delegate派生的任何类都可以,但Action通常是最合适的一个。

我想向Svick的示例指出更清晰的代码示例,毕竟我们都喜欢一行程序,不是吗

Dispatcher.Invoke((Action) delegate { /* your method here */ });
我用这个:


Dispatcher.Invoke((操作)(()=>YourCodeHere())

是的,但是
delegate{}
看起来已经是从
delegate
派生的类型,因此您的答案没有解释为什么需要强制转换。delegate(小写)是一个c#关键字,而不是一个类。这是一个非常常见的混淆。@Robert,我不是在说某种类型的
delagate
(你说得对,这种类型不存在),我是在说表达式
delegate{}
,它声明了一个匿名方法,因此认为表达式可以隐式转换为
delegate
@svick yes,但是编译器推断出的问题是您的方法应该是什么类型的委托。它不能是Delegate类型,因为它是抽象的。编译器可能会被赋予一些智能,根据您的参数和返回类型(如果有的话)创建一个匿名的委托子类,然后代表您转换为该类。。。但截至.NET4,他们还没有这样做。也许下一次?@Robert,是的,这是我的观点,我认为从你的回答看不太明显。这实际上是一个评论,而不是一个答案。塞维:是的,我完全错过了问这个问题的人实际上回答了他自己问题的那句话。。抱歉:(+1-我部分不同意Servy.Jaska,请编辑您的答案,使其充满信心地说:这是涉及匿名方法的最干净的方式。您的答案正好回答了问题标题:“使用匿名方法调用WPF Dispatcher。”-谢谢您。您可以使用方法组,例如Action Action=MyMethod;
Dispatcher.Invoke((Action) delegate { /* your method here */ });