Vra

Ek het 'n probleem opdatering n beheer op my ui uit 'n draad geskep met behulp van

ThreadPool.QueueUserWorkItem

Binne hierdie draad Ek roep

addControlToPanel(li);

As hier gewys

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

Op eerste inskrywing na addControlToPanel () panel1.InvokeRequired == ware so 'n afgevaardigde is aangehaal en dan drie maande, nou op hierdie inskrywing in addControlToPanel (), panel1.InvokeRequired == valse so ek voeg die beheer aan die paneel.

My probleem is dat selfs nadat beroep teen die beheer en panel1.InvokeRequired om valse Ek kry 'n fout op die

panel1.Controls.Add(li); 

lyn met vermelding van die gewone

Control.Invoke moet gebruik word om met kontroles geskep op 'n aparte draad.

Kan iemand sien die probleem? Die gebruik van roep om beheer toegang op 'n ander draad is iets het ek baie keer gedoen voor, maar hierdie een het my gestonk!

TIA

OneSHOT

Was dit nuttig?

Oplossing

Dit lyk asof die probleem is 'n beheer verbygaande op die roep (ListItem is 'n vorm beheer wat Ek geskape het) plaas ek refactored die kode sodat eerder as die skep van die beheer en om dit in die

addControlToPanel()

metode, ek slaag al die inligting wat nodig is om die beheer binne die metode te skep nadat beroep as so

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

Cheers

OneSHOT

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top