2013-02-06 10 views
13

In precedenza ho avutoDispatch.Invoke (nuova azione ...) con un parametro

Dispatcher.Invoke(new Action(() => colorManager.Update())); 

di aggiornamento del display a WPF da un altro thread. A causa della progettazione, ho dovuto modificare il programma e devo passare il parametro ColorImageFrame al mio metodo ColorStreamManager.Update().

seguito this collegamento, ho modificato il mio dispatcher a:

Dispatcher.Invoke(new Action<ColorStreamManager, ColorImageFrame>((p,v) => p.Update(v))); 

Si compila bene, ma non funzionare affatto. VS2010 dice "Mancata corrispondenza del conteggio dei parametri." Nel mio metodo ColorStreamManager.Update() ho RaisePropertyChanged(() => Bitmap);

Qualcuno potrebbe indicare dove ho sbagliato?

La firma di ColorStreamManager.Update() metodo è il seguente:

public void Update(ColorImageFrame frame); 
+2

Che aspetto ha la dichiarazione di 'ColorStreamManager.Update'? – Foggzie

+0

Ho aggiornato la mia domanda per rispondere alla tua domanda – ikel

+0

@ikel Non abbiamo davvero bisogno di vedere l'intera funzione, solo la firma del metodo. – Servy

risposta

20

Non si desidera che l'azione abbia parametri, perché lo Dispatcher non saprà cosa passare al metodo. Invece quello che puoi fare è chiudere la variabile:

ColorImageFrame someFrame = ...; 
Dispatcher.Invoke(new Action(() => colorManager.Update(someFrame))); 
+0

Ah! _ "chiudi la variabile" _ Avevo bisogno di quella informazione! – ikel

2

Se si chiama Invoke con una Action<T1, T2> delegato, è necessario passare i due parametri di azione alla chiamata Invoke:

ColorStreamManager colorManager = ... 
ColorImageFrame frame = ... 

Dispatcher.Invoke(
    new Action<ColorStreamManager, ColorImageFrame>((p,v) => p.Update(v)), 
    colorManager, 
    frame); 

Il Il sovraccarico di richiamo che stai utilizzando qui è Dispatcher.Invoke(Delegate, Object[]).

+0

È sinteticamente più facile e più pulito chiudere semplicemente le variabili anziché passarle in questo modo. – Servy

+0

Ma non funziona in tutte le circostanze. La cattura delle variabili esterne differisce dal passarle esplicitamente a Invoke. Vedi per esempio [qui] (http://stackoverflow.com/a/271447/1136211). Inoltre, OP ha chiesto esplicitamente questa soluzione. – Clemens

+0

Qui non è applicabile perché 'Invoke' è sincrono; non verrà restituito fino a dopo che il delegato è stato eseguito e non verrà mai eseguito dopo il ritorno del metodo. Ora se questo stava usando 'BeginInvoke', allora ci sono potenziali problemi con la semantica della chiusura se non si presta attenzione. Tali problemi possono * essere sempre * affrontati dalla semplice creazione di una nuova variabile locale per contenere una copia, se necessario. Per quanto riguarda l'OP che lo richiede, l'OP sta chiedendo come ottenere l'oggetto che ha per il metodo "Update", non ha mai detto che le chiusure non possono essere utilizzate. – Servy

Problemi correlati