2011-08-22 24 views
8

Estoy tratando de averiguar si hay una forma de invocar ToolStripMenuItem.Invoke ToolStripMenuItem

Por ejemplo, yo estoy llamando a un servicio web (ASynchrously) cuando el resultado es poblar returned.i desplegable de elementos de acuerdo a ello, (En el método de devolución de llamada)

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

pero tengo excepción

Operación entre hilos no válida: Control '' al que se accede desde un hilo que no sea el hilo en el que se creó.

No hay función de invocación asociada con el elemento toolstrip, ¿Hay otra manera que puedo hacer esto? ¿Estoy tratando de hacer esto de una manera completamente incorrecta? Cualquier entrada sería útil.

Respuesta

17

Se está intentando ejecutar código que se basan en el hilo principal de control en otro hilo, debe llamar usando Invoke método:

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

Al acceder a los controles de los miembros/Métodos de un hilo que es diferente de hilo que el control creado originalmente en, debe usar el método control.Invoke, calculará la ejecución en el delegado de invocación al hilo principal.

Editar: dado que está utilizando no ToolStripMenuItemToolStrip, la ToolStripMenuItem no tiene Invoke miembro, por lo que puede utilizar el formulario de invocar por "this.Invoke" o su toolStrip su matriz "ToolStrip" invocación, por lo que:

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

Cómo invocar ToolStripMenuItem? ¿Este control no tiene un método de invocación? –

+0

Supongo que él sabe esto ... él simplemente no puede encontrar fueron a – Carsten

+0

Khan si está usando wpf necesita usar 'Dispatcher.Invoke' –

4

Usted está intentando acceder a la opción de menú de un hilo más que el hilo principal, por lo que probar este código:

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

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

+1 para señalar' InvokeRequired' y 'BeginInvoke' –

Cuestiones relacionadas