2009-11-30 7 views
2

Je développe un Windows Mobile 5.0 et application avec .Net Compact Framework 2.0 SP2 et C#.Control.Invoke échoue au deuxième appel

J'ai ce code dans une méthode:

if (listBox1.InvokeRequired) 
{ 
    Invoke(new MethodInvoker(
     delegate() { listaBox1 = listaBox2; listBox1.Visible = true; })); 
} 
else 
{ 
    listBox1 = listBox2; 
    listBox1.Visible = true; 
} 

Quand je lance, il soulève une exception en deuxième déclaration (listBox1.Visible = true;) en disant:

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

Que se passe-t-il?

+0

Vous devez utiliser BeginInvoke, pas Invoke, pour éviter les blocages. – ctacke

Répondre

4

Vos deux ListBox ont été créés sur des threads différents. C'est, dans presque tous les cas, une très, très mauvaise idée.

1

La raison pour laquelle est il y a 2 ListBox références dans ce scénario

  1. listBox1
  2. ListBox2

Vous ne le membre InvokeRequired vérifié pour listBox1. Pourtant, vous finissez par appeler .Visible sur l'instance pointée à l'origine par listBox2. Basé sur le comportement qui en résulte, il est probable que les deux références pointaient à l'origine vers 2 instances différentes de ListBox.

Pour résoudre ce problème, vérifiez InvokeRequired sur listBox2 car c'est celui que vous finissez par utiliser.

+0

Bien que je pense que vous avez raison, cela n'explique pas pourquoi listBox2 est sur un autre thread que listBox1, puisque les deux semblent faire partie du même formulaire, qui devrait être sur un seul thread. Pouvez-vous créer un contrôle sur un thread différent du thread du parent? Cela modifie la propriété Controls, après tout ... – OregonGhost

+0

Il y a un thread qui charge des données pour l'afficher sur listBox. Les zones de liste sont des contrôles personnalisés. J'ai reçu beaucoup de messages d'erreur (Control.Invoke doit être utilisé ...) si je charge les données directement dans listBox1. C'est la raison pour laquelle il existe deux listes de sélection. – VansFannel

+0

@OregonGhost - oui, on peut créer des contrôles sur d'autres threads et la règle est la même: toute interaction avec le contrôle (excepté l'appel InvokeRequired) devrait être sur le thread de création. –

Questions connexes