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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top