Estoy intentando llamar 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 diciendo que yo
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, pero no funciona. ¿Qué me estoy perdiendo?
fuente
Invoke
yBeginInvoke
tomar unDelegate
objeto genérico , que puede representar un método de cualquier firma. En circunstancias normales (donde un delegado está fuertemente tipado a una firma particular), el compilador puede inferir el tipo de delegado específico. Es por eso que puede salirse con la suya omitiendo el tipo de delegado en otros escenarios. Sin embargo, puesto que no es ningún tipo de delegado real ya que el compilador no tiene una base razonable (o, en realidad, incluso unos medios ) a utilizar para seleccionar un tipo de delegado.Corta:
fuente
_dispatcher.BeginInvoke((Action)(DoSomething));
Uso de Lambda en línea ...
Dispatcher.BeginInvoke((Action)(()=>{ //Write Code Here }));
fuente
Si hace referencia a System.Windows.Presentation.dll desde su proyecto y lo agrega,
using System.Windows.Threading
entonces puede acceder a un método de extensión que le permite usar la sintaxis lambda.using System.Windows.Threading; ... Dispatcher.BeginInvoke(() => { });
fuente
Creamos métodos de extensión para esto. P.ej
public static void BeginInvoke(this Control control, Action action) => control.BeginInvoke(action);
Ahora podemos decir que es desde dentro de un formulario:
this.BeginInvoke(() => { ... })
.fuente