2011-08-22 6 views
8

Sto cercando di capire se c'è un modo per richiamare ToolStripMenuItem.Invoke ToolStripMenuItem

Per esempio, sto chiamando un servizio web (ASynchrously) quando risultato si popolano returned.i discesa articoli secondo risultato, (Nel metodo di call back)

ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start")); 

ma ottengo un'eccezione

Operazione cross-thread non valida: controllo '' accessibile da un thread diverso dal thread su cui è stato creato.

Non esiste una funzione invoke associato all'elemento ToolStrip, C'è un altro modo che io possa fare questo? Sto cercando di farlo in modo completamente sbagliato? Qualsiasi input sarebbe utile.

risposta

17

Si sta tentando di eseguire codice che si basano su thread principale controllo in un altro thread, si dovrebbe chiamare utilizzando Invoke metodo:

toolStrip.Invoke(() => 
{ 
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start")); 
}); 

Accedendo controlli membri/metodi da un filo che è diverso dal filo che il controllo originariamente creato su, è necessario utilizzare il metodo control.Invoke, eseguirà il marshalling dell'esecuzione nel delegato di invocare il thread principale.

Edit: Dal momento che si sta utilizzando ToolStripMenuItem non ToolStrip, il ToolStripMenuItem non dispone Invoke membro, in modo da poter utilizzare il modulo di invocare da "this.Invoke" o il vostro toolStrip della sua controllante "ToolStrip" Invoke, così:

toolStrip.GetCurrentParent().Invoke(() => 
{ 
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start")); 
}); 
+0

Come richiamare ToolStripMenuItem? Il controllo non ha alcun metodo di richiamo? –

+0

Immagino che lo sappia ... non riesce a trovare se fosse a – Carsten

+0

Khan se stai usando wpf devi usare 'Dispatcher.Invoke' –

4

Si sta tentando di accedere alla voce di menu da un thread, piuttosto che il thread principale, in modo da provare questo codice:

MethodInvoker method = delegate 
{ 
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start")); 
}; 

if (ToolStripMenu.InvokeRequired) 
{ 
    BeginInvoke(method); 
} 
else 
{ 
    method.Invoke(); 
} 
+1

+1 per indicare" InvokeRequired' e 'BeginInvoke' –