2012-03-03 2 views
42

Nessuno di questi lavori:non può convertire espressione lambda al tipo 'System.Delegate'

_uiDispatcher.Invoke(() => { }); 
_uiDispatcher.Invoke(delegate() { }); 

Tutto quello che voglio fare è richiamare un metodo in linea sul mio thread principale dell'interfaccia utente. Così ho chiamato questo sul thread principale:

_uiDispatcher = Dispatcher.CurrentDispatcher; 

E ora voglio eseguire del codice su quel thread da un altro thread. Come lo faccio? Sto usando la sintassi sbagliata?

Si noti che questo è non un'applicazione WPF; Ho fatto riferimento a WindowsBase in modo da poter accedere alla classe Dispatcher.

+0

Che tipo è '_uiDispatcher'? Hai usato l'oggetto sincronizzato dell'interfaccia utente? – IAbstract

+0

'uiDispatcher' è un'istanza di http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx. Pensavo che fosse implicito da '_uiDispatcher = Dispatcher.CurrentDispatcher'. "L'interfaccia utente" non ha un oggetto sincronizzato AFAIK .... ma come dovrei usarlo? Cosa farebbe per me? – mpen

+0

Ah ... ok, non penso che il dispatcher di thread funzionerà. È un'applicazione WinForm? – IAbstract

risposta

53

Il problema è che non si sta fornendo il tipo esatto del delegato che si desidera richiamare. Dispatcher.Invoke prende solo un Delegate. È un Action<T>? In tal caso, che cos'è T? È un MethodInvoker? Action? Che cosa?

Se il delegato non accetta argomenti e non restituisce nulla, è possibile utilizzare Action o MethodInvoker. Prova questo:

_uiDispatcher.Invoke(new Action(() => { })); 
+0

Credo di essere abituato alla maggior parte dei metodi che accettano che un delegato fornisca una firma, quindi non ho bisogno di specificarne uno. Questo ha senso comunque. Grazie! – mpen

+1

Non penso che funzioni come pensavo. Il metodo non sembra mai essere invocato; Immagino che WPF di solito la gestisca per te e periodicamente esegua quei metodi? Forse dovrei solo un 'Queue ' e gestirlo io stesso allora ... – mpen

1

A meno che non ho perso qualcosa, tutto quello che ci hai detto è questo è non è un'applicazione WPF. Non penso che il Dispatcher sia la classe corretta da usare.

se questo è un app WinForm, il tuo thread dell'interfaccia utente può accedere tramite il WindowsFormsSynchronizationContext

+0

Non è neanche un'app WinForm; Sto usando OpenGL. OpenGL utilizza un contesto GL e puoi disegnare solo dallo stesso thread su cui è stato creato. Stavo cercando di trovare un modo per eseguire alcune cose sul thread principale ... Ho usato 'Dispatcher' in un'app WPF prima, quindi ho pensato di poterlo usare di nuovo per risolvere questo problema. – mpen

4
this.Dispatcher.Invoke((Action)(() => { textBox1.Text = "Test 123"; }));