Dispatcher.BeginInvoke: Cannot convert lambda to System.Delegate
I'm trying to call System.Windows.Threading.Dispatcher.BeginInvoke
. The signature of the method is this:
BeginInvoke(Delegate method, params object[] args)
I'm trying to pass it a Lambda instead of having to create a Delegate.
_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );
It's giving me a compiler error saying that I
can't convert the lambda to a System.Delegate.
The signature of the delegate takes an object as a parameter and returns void. My lambda matches this, yet it's not working. What am I missing?
Solution 1:
Shorter:
_dispatcher.BeginInvoke((Action)(() => DoSomething()));
Solution 2:
Since the method takes a System.Delegate, you need to give it a specific type of delegate, declared as such. This can be done via a cast or a creation of the specified delegate via new DelegateType as follows:
_dispatcher.BeginInvoke(
new Action<MyClass>((sender) => { DoSomething(); }),
new object[] { this }
);
Also, as SLaks points out, Dispatcher.BeginInvoke takes a params array, so you can just write:
_dispatcher.BeginInvoke(
new Action<MyClass>((sender) => { DoSomething(); }),
this
);
Or, if DoSomething is a method on this object itself:
_dispatcher.BeginInvoke(new Action(this.DoSomething));