我正试图致电System.Windows.Threading.Dispatcher.BeginInvoke
。方法的签名是这样的:
BeginInvoke(Delegate method, params object[] args)
我正在尝试将其传递给Lambda而不必创建委托。
_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );
它给我一个编译错误,说我
无法将lambda转换为System.Delegate。
委托的签名将对象作为参数并返回void。我的lambda匹配这个,但它不起作用。我错过了什么?
答案 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(() => { ... })
。