2013-01-17 10 views
10

Sto avendo un problema che non riesco a capire, anche se il suo tipo di domanda standard qui su Stackoverflow.Impossibile convertire l'espressione lambda per digitare 'System.Delegate' perché non è un tipo di delegato?

Sto cercando di aggiornare i miei Bing Maps in modo asincrono utilizzando il seguente codice (si badi bene, questo è da un vecchio progetto Silverlight e non sembra funzionare in WPF)

_map.Dispatcher.BeginInvoke(() => 
{ 
    _map.Children.Clear(); 
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map))) 
    { 
     _map.Children.Add(projectedPin.GetElement(ClusterTemplate)); 
    } 
}); 

Che cosa sto facendo di sbagliato ?

+6

E che dire '(Azione) (() => ...)'? – acrilige

+0

@acrilige grazie! perché non l'hai fatto come risposta ???? –

risposta

30

Bisogna lanciare in modo esplicito ad un Action in modo che la conversione a System.Delegate a calciare in

Cioè :

_map.Dispatcher.BeginInvoke((Action)(() => 
{ 
    _map.Children.Clear(); 
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map))) 
    { 
     _map.Children.Add(projectedPin.GetElement(ClusterTemplate)); 
    } 
})); 
+5

Per il tuo interesse, potresti voler vedere il commento che ho aggiunto alla risposta di SLaks –

13

Il parametro del metodo BeginInvoke() è la classe base Delegate.

È possibile convertire solo un'espressione lambda in un tipo di delegato concreto.

Per risolvere questo problema, è necessario costruire in modo esplicito un delegato:.

BeginInvoke(new MethodInvoker(() => { ... })); 
+10

Poco noto: è * marginalmente * più efficiente usare 'MethodInvoker' qui, piuttosto che' Action'/'ThreadStart', ecc. - anche se la firma è identica: ha il supporto diretto in' Control.InvokeMarshaledCallbackDo' (via 'is'/cast) - dove -come altri tipi di delegati usano' DynamicInvoke'. Gli unici altri tipi di delegati direttamente supportati sono 'WaitCallback' e' EventHandler' –

2

Prova

Dispatcher.BeginInvoke(new System.Threading.ThreadStart(delegate 
{ 
//Do something 
})); 

Oppure utilizzare l'azione

+4

Per tuo interesse, potresti voler vedere il commento che ho aggiunto a SLaks 'answer –

+0

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx: Il delegato può essere un'istanza di EventHandler, nel qual caso il parametro mittente conterrà questo controllo e il parametro dell'evento contenere EventArgs.Empty. Il delegato può anche essere un'istanza di MethodInvoker o qualsiasi altro delegato che accetta un elenco di parametri void. Una chiamata a un delegato EventHandler o MethodInvoker sarà più veloce di una chiamata a un altro tipo di delegato. – Alex

Problemi correlati