Pergunta

Estou tendo um problema ao atualizar um controle no meu ui de um segmento criado usando

ThreadPool.QueueUserWorkItem

Dentro deste segmento estou chamando

addControlToPanel(li);

Como mostrado aqui

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);
    }
}

Na primeira entrada para addControlToPanel () panel1.InvokeRequired == true para um delegado é instanciado e, em seguida, invocada, agora neste entrada em addControlToPanel (), panel1.InvokeRequired == false, então eu adicionar o controle para o painel.

O meu problema é que, mesmo depois de invocar contra o controle e panel1.InvokeRequired ser falso eu recebo um erro no

panel1.Controls.Add(li); 

linha indicando o habitual

Control.Invoke deve ser usado para interagir com controles criados em um segmento separado.

Alguém pode detectar o problema? Usando invoke para controles de acesso em outro segmento é algo que tenho feito muitas vezes antes, mas este tem me perplexo!

TIA

OneShot

Foi útil?

Solução

Parece que o problema estava passando um controle sobre a invocação (ListItem é um controlo de formulário que eu criei) em vez i refatorado o código para que, em vez de criar o controle e passá-la para o

addControlToPanel()

método, eu passar todas as informações necessárias para criar o controle dentro do método depois de invocar como assim

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);
    }
}

Felicidades

OneShot

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top