c# wpf lambda dispatcher begininvoke

c# - Dispatcher.BeginInvoke: No se puede convertir lambda a System.Delegate



wpf (5)

System.Windows.Threading.Dispatcher.BeginInvoke llamar a System.Windows.Threading.Dispatcher.BeginInvoke . La firma del método es esta:

BeginInvoke(Delegate method, params object[] args)

Estoy intentando pasarle un Lambda en lugar de tener que crear un Delegado.

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

Me está dando un error de compilación que dice que

no se puede convertir el lambda a System.Delegate.

La firma del delegado toma un objeto como parámetro y devuelve vacío. Mi lambda coincide con esto, sin embargo, no está funcionando. ¿Qué me estoy perdiendo?


Como el método requiere un System.Delegate , debe darle un tipo específico de delegado, declarado como tal. Esto puede hacerse a través de un elenco o una creación del delegado especificado a través de un nuevo DelegateType de la siguiente manera:

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

Además, como señala SLaks , Dispatcher.BeginInvoke toma una matriz params, por lo que puede simplemente escribir:

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

O bien, si DoSomething es un método en este objeto en sí:

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


Corta:

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


Creamos métodos de extensión para esto. P.ej

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

Ahora podemos llamarlo desde un formulario: this.BeginInvoke(() => { ... }) .


Si hace referencia a System.Windows.Presentation.dll desde su proyecto y lo agrega using System.Windows.Threading , puede acceder a un método de extensión que le permite usar la sintaxis lambda.

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


Usando Inline Lambda ...

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