C # WM6 Compact Framework Kreuz Thema Kommunikation Problem
-
06-07-2019 - |
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
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
vorbeiaddControlToPanel()
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