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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top