C # WM6 Compact Framework Cruz Tópico Problema de comunicação
-
06-07-2019 - |
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
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