2009-06-19 16 views
0

Ich habe ein Problem, eine Kontrolle auf meinem ui von einem Thread zu aktualisieren erstellt mitC# WM6 Compact Framework Kreuz Thema Kommunikation Problem

ThreadPool.QueueUserWorkItem 

Innerhalb dieses Threads Ich rufe

addControlToPanel(li); 

Wie gezeigt hier

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 den ersten Eintrag zu addControlToPanel() panel1.InvokeRequired == true, so ein Delegierter inst antiated und dann aufgerufen, jetzt auf diesen Eintrag in addControlToPanel(), panel1.InvokeRequired == false, so dass ich das Steuerelement zum Panel hinzufügen.

Mein Problem ist, dass auch nach gegen die Steuer Aufruf und panel1.InvokeRequired falsch zu sein ich einen Fehler auf dem

bekommen
panel1.Controls.Add(li); 

Linie unter Angabe der üblichen

Control.Invoke muss die Interaktion mit verwendet werden Steuerelemente, die in einem separaten Thread erstellt wurden.

Kann jemand das Problem erkennen? Die Verwendung von invoke, um auf Steuerelemente in einem anderen Thread zuzugreifen, ist etwas, was ich schon oft getan habe, aber dieses hier hat mich ratlos gemacht!

TIA

OneShot

Antwort

1

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

addControlToPanel() 

Methode, übergeben wir alle Informationen, die Sonde in der Methode zu schaffen, um so nach wie

Aufruf
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