He estado luchando con esto durante bastante tiempo: Tengo una función diseñada para agregar control a un panel con manejo de hilos cruzados, pero el problema es que el panel y el control están en "InvokeRequired = false" - Recibo una excepción diciéndome que se accede a uno de los controles internos desde un hilo que no sea el hilo en el que se creó, el fragmento es así:"Operación de hilo cruzado no válida" excepción en los controles internos
public delegate void AddControlToPanelDlgt(Panel panel, Control ctrl);
public void AddControlToPanel(Panel panel, Control ctrl)
{
if (panel.InvokeRequired)
{
panel.Invoke(new AddControlToPanelDlgt(AddControlToPanel),panel,ctrl);
return;
}
if (ctrl.InvokeRequired)
{
ctrl.Invoke(new AddControlToPanelDlgt(AddControlToPanel),panel,ctrl);
return;
}
panel.Controls.Add(ctrl); //<-- here is where the exception is raised
}
el mensaje de excepción es la siguiente:
"Cross- operación hilo no válido: Control 'pnlFoo' se accede desde un subproceso distinto del subproceso que se creó el"
('pnlFoo' está bajo ctrl.Controls)
¿Cómo puedo añadir a ctrl panel? !
Cuando el código llega al "panel.Controles.Agregar (ctrl);" línea - tanto el panel como la propiedad "InvokeRequired" del ctrl están configuradas en falso, el problema es que los controles dentro de ctrl tienen "InvokeRequired" establecido en verdadero. Para aclarar cosas: "panel" se crea en el hilo base y "ctrl" en el nuevo hilo, por lo tanto, se debe invocar "panel" (haciendo que "ctrl" necesite invocar nuevamente). Una vez que se realizan ambas invocaciones, llega al panel.Controles.Agregar (ctrl) comando (tanto "panel" como "ctrl" no necesita invocación en este estado)
Aquí hay un pequeño fragmento del completo programa:
public class ucFoo : UserControl
{
private Panel pnlFoo = new Panel();
public ucFoo()
{
this.Controls.Add(pnlFoo);
}
}
public class ucFoo2 : UserControl
{
private Panel pnlFooContainer = new Panel();
public ucFoo2()
{
this.Controls.Add(pnlFooContainer);
Thread t = new Thread(new ThreadStart(AddFooControlToFooConatiner());
t.Start()
}
private AddFooControlToFooConatiner()
{
ucFoo foo = new ucFoo();
this.pnlFooContainer.Controls.Add(ucFoo); //<-- this is where the exception is raised
}
}
Aquí está el programa: public class ucFoo: UserControl { private Panel pnlFoo = new Panel(); public ucFoo() { this.Controls.Add (pnlFoo); } } public class ucFoo2: UserControl { private Panel pnlFooContainer = new Panel(); public ucFoo2() { this.Controls.Add (pnlFooContainer); Subproceso t = subproceso nuevo (nuevo ThreadStartAddFooControlToFooConatiner()); t.Start(); } private AddFooControlToFooConatiner() { ucFoo foo = new ucFoo(); this.pnlFooContainer.Controls.Add (ucFoo); // <- aquí es donde se genera la excepción } } – Nissim
Agregué el fragmento como una respuesta para una mejor lectura – Nissim