2010-06-24 16 views
5

Domanda alternativa: perché VS10 è così ansioso di lamentarsi di Invoke?Quale assembly C# contiene Invoke?

Nella mia ricerca di continuare a fare il mio lavoro app diventare i mondi migliori programmatore C#, ho deciso che le discussioni sono una buona cosa ™.

MSDN ha un articolo utile sulla creazione di thread-safe calls to controls, ma esso (e apparentemente ogni altro articolo sull'argomento) fa riferimento obliquamente a un metodo chiamato Invoke. A volte anche BeginInvoke, che I've read is to be preferred.

Tutto questo sarebbe fantastico, se potessi ottenere Visual Studio per riconoscere Invoke. MSDN dice che it is contained in the System.Windows.Forms assembly, ma sto già "usando" quello. A dire il vero, ho anche provato a utilizzare System.Threading, ma senza risultato.

Quali anelli devo passare per richiamare il funzionamento?

+0

Cosa intendi per "Visual Studio riconosce Invoke"? Intellisense? –

+0

Stai parlando di invocare un metodo su un controllo che è stato creato su un thread diverso dal thread attualmente in esecuzione? –

+1

+1 per umorismo ... –

risposta

4

Invoke è in controllo. Cioè Control.Invoke();

Non c'è modo di chiamare Invoke direttamente perché non esiste un tale metodo in System.Windows.Forms. Il metodo Invoke è un membro di controllo.

Ecco un example ho fatto in precedenza:

public delegate void AddListViewItemCallBack(ListView control, ListViewItem item); 
public static void AddListViewItem(ListView control, ListViewItem item) 
{ 
    if (control.InvokeRequired) 
    { 
     AddListViewItemCallBack d = new AddListViewItemCallBack(AddListViewItem); 
     control.Invoke(d, new object[] { control, item }); 
    } 
    else 
    { 
     control.Items.Add(item); 
    } 
} 
2

è necessario chiamare Invoke su un un'istanza di qualcosa che lo contiene - se si sta utilizzando Windows Forms, che sarebbe un controllo:

control.Invoke(someDelegate); 

o per il codice all'interno di un modulo, è possibile utilizzare l'implicito this di riferimento:

Invoke(someDelegate); 

non dovrebbe essere necessario passare attraverso qualsiasi cerchi particolari. Se Visual Studio si lamenta, si prega di specificare l'errore del compilatore e il codice di cui si lamenta. Non c'è niente di speciale su Invoke qui.

2

Il winform Invoke è un metodo di istanza di Control - è sufficiente un'istanza di un controllo (che può essere this in molti casi). Per esempio:

txtBox.Invoke(...); 

Si può accedere anche tramite un'interfaccia, o la sincronizzazione al contesto se si desidera che l'astrazione - ma l'approccio più semplice è quello di gestire la cosa presso l'interfaccia utente tramite un evento, in cui i controlli caso sono comodamente disponibili .

0

Invoke è un metodo sugli oggetti, in genere presente sui controlli nella libreria Form e in alcune classi asincrone. Ovviamente hai bisogno di oggetti specifici per poter chiamare Invoke su del controllo/classe.

1

Se davvero si vuole diventare il mondi miglior programmatore C# si deve imparare che le discussioni non sono una buona cosa se non utilizzati correttamente.

L'aggiornamento dell'interfaccia utente attraverso i thread è in genere un segno che si sta abusando dei thread.

Ad ogni modo, non è sufficiente utilizzare using System.Windows.Forms, è necessario aggiungerlo ai riferimenti. Fare un clic destro sul References nel progetto explorer, quindi aggiungere i riferimenti e selezionare System.Windows.Forms

+0

Gee, grazie! Sei andato e fatto andato mi ha fatto confuso. (Ecco un'altra domanda a cui potresti voler rispondere: http://stackoverflow.com/questions/3110154/why-is-the-explicit-management-of-threads-a-bad-thing) –

+0

"L'aggiornamento dell'interfaccia utente tra i thread è di solito un segno che stai abusando di discussioni. " Wow, questa è una novità per me. Quindi, se inserisco una lunga operazione di analisi in un thread BG per mantenere l'interfaccia utente reattiva, ma l'utente vorrebbe vedere i risultati incrementali rapidamente, quindi il thread BG pubblica periodicamente i risultati sul thread dell'interfaccia utente, si tratta di un abuso? E hai intenzione di rivelare la soluzione migliore? –

+2

Sì, è abbastanza semplice: utilizzare gli eventi. BG Thread fornisce un evento a cui l'interfaccia utente può iscriversi, ad esempio "FileCopied", "NumberCalculated", ecc. L'interfaccia utente può iscriversi e il worker in background funzionerà comunque senza modifiche se si passa il codice da winform a WPF, implementare interfaccia utente multilingue, modifica una finestra di dialogo noioso in una finestra di dialogo elegante, ecc. – dbemerlin

0

Stai presumibilmente cercando di chiamare Invoke dall'interno di una classe (cioè non all'interno di un Form o un Control). Sposta il tuo codice fuori dalla classe e in una forma o controllo, e vedrai che Invoke compila e funziona correttamente (in senso stretto, il tuo codice dovrebbe fare riferimento allo this.Invoke, che rende chiara la fonte del metodo, ma Invoke funzionerà anche da quando assume il this).