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
}));