2009-06-19 5 views
0

Je vais avoir un problème de mise à jour d'un contrôle sur mon ui d'un nouveau thread utilisantC# WM6 Compact Framework Cross fil Problème de communication

ThreadPool.QueueUserWorkItem 

Dans ce fil, je fais appel

addControlToPanel(li); 

Comme le montre ici

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

Lors de la première entrée à addControlToPanel() panel1.InvokeRequired == true si un délégué est inst antiated puis invoqué, maintenant sur cette entrée dans addControlToPanel(), panel1.InvokeRequired == false donc j'ajoute le contrôle au panneau.

Mon problème est que même après avoir invoqué contre le contrôle et panel1.InvokeRequired étant faux, je reçois une erreur sur le

panel1.Controls.Add(li); 

ligne indiquant l'habituel

Control.Invoke doit être utilisé pour interagir avec contrôles créés sur un thread séparé.

Quelqu'un peut-il repérer le problème? Utiliser invoke pour accéder aux contrôles sur un autre thread est quelque chose que j'ai fait plusieurs fois auparavant mais celui-ci m'a bloqué!

TIA

Oneshot

Répondre

1

Il semble que le problème a été le passage d'un contrôle sur l'Invoke (ListItem est un contrôle de forme que j'ai créé) à la place que je refactorisé le code de sorte que, plutôt que de créer le contrôle et le passage dans la méthode

addControlToPanel() 

, je passe toutes les informations nécessaires pour créer le contrôle dans la méthode après l'appel comme si

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

Vive

Oneshot

Questions connexes