Dispatcher.BeginInvoke:不能将lambda转换为System.Delegate

我试图调用System.Windows.Threading.Dispatcher.BeginInvoke 。 该方法的签名是这样的:

 BeginInvoke(Delegate method, params object[] args) 

我试图将它传递给一个Lambda,而不必创build一个Delegate。

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

它给我一个编译器错误,说我不能将lambda转换为System.Delegate。 委托的签名将一个对象作为参数并返回void。 我的lambda匹配这个,但它不工作。 我错过了什么?

由于这个方法需要一个System.Delegate ,所以你需要给它一个特定types的委托,这样声明。 这可以通过转换或通过新的DelegateType创build指定的委托来完成,如下所示:

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

另外,正如SLak指出的那样, Dispatcher.BeginInvoke需要一个params数组,所以你可以写:

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

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

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

短:

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

使用内联Lambda …

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

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

 using System.Windows.Threading; ... Dispatcher.BeginInvoke(() => { });