Question

Je rencontre un problème pour mettre à jour un contrôle sur mon interface utilisateur à partir d'un thread créé à l'aide de

ThreadPool.QueueUserWorkItem

Dans ce fil, j'appelle

addControlToPanel(li);

Comme indiqué 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 de addControlToPanel () panel1.InvokeRequired == true, un délégué est instancié puis appelé. Cette entrée est maintenant insérée dans addControlToPanel (), panel1.InvokeRequired == false, ce qui permet d'ajouter le contrôle au panneau. / p>

Mon problème est que même après avoir invoqué le contrôle et le panneau1.InvokeRequired étant faux, j'obtiens une erreur sur le

panel1.Controls.Add(li); 

ligne indiquant l'habituel

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

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

TIA

OneSHOT

Était-ce utile?

La solution

Il semble que le problème ait été de passer un contrôle sur l'appel (ListItem est un contrôle de formulaire que j'ai créé). J'ai plutôt refactoré le code afin que, plutôt que de créer le contrôle et de le passer dans le

addControlToPanel()

, je transmets toutes les informations nécessaires pour créer le contrôle dans la méthode après l'avoir appelé de cette manière

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

A bientôt

OneSHOT

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top