In Silverlight 4 ho una classe di servizio personalizzata che ha un evento Completato asincrono. All'interno della manifestazione Completato prendo i dati restituiti e invocare un metodo popolano via qualcosa di simile:Dispatcher.Invoke con delegato anonimo funziona in Silverlight ma non WPF
private void service_Completed(object sender, CompletedEventArgs args)
{
Dispatcher.BeginInvoke(() => populateInbox(args.Jobs));
}
private void populateInbox(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
}
Le BeginInvoke
opere in SL4, tuttavia quando ho portato a WPF ottengo il seguente errore:
Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
ho provato a cambiarlo con un filtro in linea, anonima, delegato parametrizzato:
Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
});
tuttavia, che produce lo stesso errore in fase di compilazione.
Qualche idea su come farlo funzionare in WPF? Refactoring per utilizzare il BackgroundWorker
non è un'opzione per me.
sto ottenendo questo errore ora: è necessario un riferimento a un oggetto per il campo non statico, metodo o proprietà 'System.Windows.Threading.Dispatcher.BeginInvoke (System.Delegate, params object []) '. L'ho separato in 2 righe per provare a vedere che cosa causa l'errore. var d = new Action (() => populateInbox (args.Jobs)); Dispatcher.BeginInvoke (d, args.Jobs); L'errore si verifica sulla seconda riga. –
Dispatcher.BeginInvoke (d, nuovo oggetto [] {args.Jobs}); Non funziona neanche. –
@Edward: 'Dispatcher' non è una classe statica. Dovrai chiamare questa funzione nel contesto di un elemento dell'interfaccia utente che ha una proprietà 'Dispatcher', o dovrai passare nel dispatcher come un altro argomento. –