2011-02-08 14 views
64

Sto provando a chiamare System.Windows.Threading.Dispatcher.BeginInvoke. La firma del metodo è questo:Dispatcher.BeginInvoke: impossibile convertire lambda in System.Delegate

BeginInvoke(Delegate method, params object[] args) 

Sto cercando di passare un lambda invece di dover creare un delegato.

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

E mi sta dando un errore del compilatore dicendo che non posso convertire il lambda ad uno System.Delegate. La firma del delegato prende un oggetto come parametro e restituisce void. Il mio lambda corrisponde a questo, ma non funziona. Cosa mi manca?

risposta

60

Poiché il metodo accetta uno System.Delegate, è necessario assegnargli un tipo specifico di delegato, dichiarato come tale. Questo può essere fatto tramite un cast o una creazione del delegato specificato tramite nuova DelegateType come segue:

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

Inoltre, come SLaks punti fuori, Dispatcher.BeginInvoke prende una matrice params, quindi si può solo scrivere:

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

Oppure, se DoSomething è un metodo su questo oggetto stesso:

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

E 'una matrice 'params'. – SLaks

+3

Ma does (x) => {DoSomething(); } corrisponde alla firma del delegato? Pensavo che fosse tutto ciò che avrei dovuto specificare. – Micah

+0

@Micah: System.Delegate non ha una firma - è solo "qualsiasi delegato". È necessario fornirgli un tipo di delegato con un sig. che corrisponde al tuo utilizzo. –

59

breve:

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

Ancora più corto: non penso che sia necessario utilizzare le parentesi graffe {} e il punto e virgola attorno all'espressione. – sp3ctum

+3

Non è nemmeno necessario(), quindi può essere '_dispatcher.BeginInvoke ((Action) (DoSomething));' – mycroes

5

Se si fa riferimento a System.Windows.Presentation.dll dal progetto e si aggiunge using System.Windows.Threading, è possibile accedere a un metodo di estensione che consente di utilizzare la sintassi lambda.

using System.Windows.Threading; 

... 

Dispatcher.BeginInvoke(() => 
{ 
}); 
+0

Non riesco a farlo funzionare. Potresti andare un po 'più in dettaglio? –

+0

Ho aggiunto un semplice esempio.Ricordati di fare riferimento a System.Windows.Presentation.dll –

+0

Questo è esattamente ciò che io ma ora funziona ... strano. Forse ho fatto qualcosa di sbagliato l'ultima volta. –

5

Utilizzando Inline Lambda ...

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