Frage

Ich habe ein Problem, eine Kontrolle auf meinem ui von einem Thread zu aktualisieren erstellt mit

ThreadPool.QueueUserWorkItem

Innerhalb dieses Threads i Aufruf ist

addControlToPanel(li);

Wie hier gezeigt

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

Auf dem ersten Eintrag zu addControlToPanel () panel1.InvokeRequired == true, so ein Delegierter instanziiert wird und dann aufgerufen, jetzt auf diesem Eintrag in addControlToPanel (), panel1.InvokeRequired == false so füge ich die Kontrolle auf das Panel.

Mein Problem ist, dass auch nach gegen die Steuer Aufruf und panel1.InvokeRequired falsch zu sein Ich erhalte eine Fehlermeldung auf dem

panel1.Controls.Add(li); 

Zeile unter Angabe der üblichen

Control.Invoke muss verwendet werden, mit den Kontrollen auf einem separaten Thread erstellt zu interagieren.

Kann jemand das Problem vor Ort? Mit Aufrufen Kontrollen für den Zugriff auf einen anderen Thread ist etwas, das ich schon viele Male zuvor getan haben, aber dieses hat mich ratlos!

TIA

OneShot

War es hilfreich?

Lösung

Es scheint, das Problem, eine Kontrolle über die invoke vorging (ListItem ist ein Formular-Steuerelement, das ich geschaffen habe) anstelle Refactoring ich den Code so, dass, anstatt die Kontrolle zu schaffen und es in dem

vorbei
addControlToPanel()

Methode, i passieren die alle Informationen benötigt nach dem Aufruf, wie so die Kontrolle innerhalb der Methode erstellen

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

Prost

OneShot

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top