2011-02-08 33 views
64

Estoy tratando de llamar al System.Windows.Threading.Dispatcher.BeginInvoke. La firma del método es la siguiente:Dispatcher.BeginInvoke: No se puede convertir lambda a System.Delegate

BeginInvoke(Delegate method, params object[] args) 

Estoy tratando de 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 puedo 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?

Respuesta

60

Dado que el método toma un System.Delegate, necesita darle un tipo específico de delegado, declarado como tal. Esto se puede hacer a través de un yeso o una creación del delegado especificado a través de nueva DelegateType de la siguiente manera:

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

También, como SLaks puntos cabo, Dispatcher.BeginInvoke toma una matriz params, por lo que se acaba de escribir:

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

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

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

Es un array 'params'. – SLaks

+3

Pero does not (x) => {DoSomething(); } coincide con la firma del delegado? Pensé que eso era todo lo que debería especificar. – Micah

+0

@Micah: System.Delegate no tiene una firma, es solo "cualquier delegado". Debe proporcionarle un tipo de delegado con un sig. que coincide con su uso. –

59

Shorter:

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

Aún más corto: no creo que necesites las llaves {} y el punto y coma alrededor de la expresión. – sp3ctum

+3

Ni siquiera necesita(), por lo que puede ser '_dispatcher.BeginInvoke ((Acción) (DoSomething));' – mycroes

5

Si hace referencia a System.Windows.Presentation.dll desde su proyecto y 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(() => 
{ 
}); 
+0

No puedo hacer que esto funcione. ¿Podrías ir un poco más al detalle? –

+0

He agregado un ejemplo simple.Recuerde hacer referencia a System.Windows.Presentation.dll –

+0

Eso es exactamente lo que yo pero ahora funciona ... raro. Tal vez hice algo mal la última vez. –

5

Usando Inline Lambda ...

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