C # WM6 Compact Framework Problema de comunicación entre hilos
-
06-07-2019 - |
Pregunta
Tengo un problema para actualizar un control en mi interfaz de usuario desde un hilo creado usando
ThreadPool.QueueUserWorkItem
Dentro de este hilo que estoy llamando
addControlToPanel(li);
Como se muestra aquí
private delegate void addControlToPanelDelegate(ListItem li);
private void addControlToPanel(ListItem li)
{
if (panel1.InvokeRequired)
{
addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
panel1.Invoke(d, new object[] { li });
}
else
{
panel1.Controls.Add(li);
}
}
En la primera entrada a addControlToPanel () panel1.InvokeRequired == true para que se delegue un delegado y luego se invoque, ahora en esta entrada en addControlToPanel (), panel1.InvokeRequired == false, así que agrego el control al panel.
Mi problema es que incluso después de invocar contra el control y el panel1.InvokeRequired siendo falso obtengo un error en el
panel1.Controls.Add(li);
línea que indica lo habitual
Control.Invoke debe usarse para interactuar con los controles creados en un hilo separado.
¿Alguien puede detectar el problema? ¡Usar invocar para acceder a los controles en otro hilo es algo que he hecho muchas veces antes, pero este me tiene perplejo!
TIA
OneSHOT
Solución
Parece que el problema fue pasar un control sobre la invocación (ListItem es un control de formulario que he creado) en lugar de eso refactoricé el código para que en lugar de crear el control y pasarlo al
addControlToPanel()
método, paso toda la información necesaria para crear el control dentro del método después de invocar como tal
private delegate void addControlToPanelDelegate(string picname, string thumburl, PicasaEntry entry, Int32 top, EventHandler clickevent);
private void addControlToPanel(string picname, string thumburl, PicasaEntry entry, Int32 Ordinal,EventHandler clickevent)
{
if (panel1.InvokeRequired)
{
addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
this.Invoke(d, new object[] { picname, thumburl, entry, Ordinal, clickevent });
//panel1.Invoke(d, new object[] { li });
}
else
{
ListItem li = new ListItem(picname, thumburl, entry);
li.Top = Ordinal * li.Height;
li.Click += clickevent;
panel1.Controls.Add( li);
}
}
Saludos
OneSHOT