Dispatcher.BeginInvoke:无法将lambda转换为System.Delegate

时间:2011-02-08 17:49:16

标签: c# wpf lambda dispatcher begininvoke

我正试图致电System.Windows.Threading.Dispatcher.BeginInvoke。方法的签名是这样的:

BeginInvoke(Delegate method, params object[] args)

我正在尝试将其传递给Lambda而不必创建委托。

_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );

它给我一个编译错误,说我

  

无法将lambda转换为System.Delegate。

委托的签名将对象作为参数并返回void。我的lambda匹配这个,但它不起作用。我错过了什么?

5 个答案:

答案 0 :(得分:67)

更短的:

_dispatcher.BeginInvoke((Action)(() => DoSomething()));

答案 1 :(得分:66)

由于该方法采用System.Delegate,因此您需要为其指定特定类型的委托,并将其声明为此类。这可以通过强制转换或通过新的DelegateType创建指定的委托来完成,如下所示:

_dispatcher.BeginInvoke(
     new Action<MyClass>((sender) => { DoSomething(); }),
     new object[] { this } 
  );

另外,正如SLaks指出的那样,Dispatcher.BeginInvoke采用了一个参数数组,所以你可以写一下:

_dispatcher.BeginInvoke(
     new Action<MyClass>((sender) => { DoSomething(); }),
     this
  );

或者,如果DoSomething是此对象本身的方法:

_dispatcher.BeginInvoke(new Action(this.DoSomething));

答案 2 :(得分:5)

如果您从项目中引用System.Windows.Presentation.dll并添加using System.Windows.Threading,则可以访问允许您使用lambda语法的扩展方法。

using System.Windows.Threading;

...

Dispatcher.BeginInvoke(() =>
{
});

答案 3 :(得分:5)

使用Inline Lambda ...

Dispatcher.BeginInvoke((Action)(()=>{
  //Write Code Here
}));

答案 4 :(得分:1)

我们为此创建扩展方法。 E.g。

public static void BeginInvoke(this Control control, Action action)
    => control.BeginInvoke(action);

现在我们可以在表单中调用它:this.BeginInvoke(() => { ... })