C # WM6 Problema di comunicazione cross-thread compatto quadro
-
06-07-2019 - |
Domanda
Sto riscontrando problemi nell'aggiornamento di un controllo sulla mia interfaccia utente da un thread creato utilizzando
ThreadPool.QueueUserWorkItem
All'interno di questa discussione sto chiamando
addControlToPanel(li);
Come mostrato qui
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);
}
}
Alla prima voce di addControlToPanel () panel1.InvokeRequired == true, quindi un delegato viene istanziato e quindi invocato, ora su questa voce in addControlToPanel (), panel1.InvokeRequired == false, quindi aggiungo il controllo al pannello.
Il mio problema è che anche dopo aver invocato il controllo e panel1.InvokeRequired essendo falso ottengo un errore sul
panel1.Controls.Add(li);
riga che indica il solito
Control.Invoke deve essere usato per interagire con i controlli creati su un thread separato.
Qualcuno può individuare il problema? Usare invoke per accedere ai controlli su un altro thread è qualcosa che ho fatto molte volte prima, ma questo mi ha lasciato perplesso!
TIA
OneShot
Soluzione
Sembra che il problema fosse passare un controllo sull'invocazione (ListItem è un controllo modulo che ho creato) invece ho riformattato il codice in modo che invece di creare il controllo e passarlo nel
addControlToPanel()
metodo, passo tutte le informazioni necessarie per creare il controllo all'interno del metodo dopo averlo richiamato
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);
}
}
Saluti
OneShot