Bonjour
J'ai une application multithread qui doit faire une mise à jour d'une treeView.
Comme la mise à jour se fait à partir de plusieurs thread différents, j'ai du utiliser la fonction InvokeRequired pour que le code fonctionne (j'ai découvert ça dans msdn).
Le morceau de code implémené dans ma Form est le suivant:
La pluspart du temps, tout se passe bien. Mais de temps en temps, j'ai le message d'erreur suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 delegate int addMyMessageNodeCallback(int indexNode, MyMessage request); public int addMyMessageNode(int indexNode, MyMessage request) { int index; if (this.treeView1.InvokeRequired) { addMyMessageNodeCallback d = new addMyMessageNodeCallback(addMyMessageNodeMethod); index = (int)(this.Invoke(d, new object[] { indexNode, request })); } else { index = addMyMessageNodeMethod(indexNode, request); } return index; }
Or quand je vais en mode debug, toute les variables sont correctement initialisées. J'ai essayé de remplacer int index par un Object quelconque (pour me prémunir de problème de cast), mais le problème est resté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 L'argument spécifié n'était pas dans les limites de la plage des valeurs valides. Nom du paramètre : index L'exception System.ArgumentOutOfRangeException n'a pas été gérée Message="L'argument spécifié n'était pas dans les limites de la plage des valeurs valides.\r\nNom du paramètre*: index" Source="System.Windows.Forms" ParamName="index" StackTrace: à System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) à System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) à Proxy.Form1.addMyMessageNode(Int32 indexNode, MyMessage request) dans \Form1.cs:ligne 375 InnerException:
D'autre part, il semble que quand je fait du pas à pas dans le debugger, aprè que VS m'ait rendu la main à cause de l'excepion non gérée, l'erreur ne se produit pas.
L'erreur n'est pas tout à fait aléatoire et semble se produire quand il y a un peu de charge mais l'utilisation du InvokeRequired est bien censé résoudre ce problème non ?
Quelqu'un aurait-il des idées sur le problème ? Ou bien une autre méthode pour ajouter des éléments dans une TreeView à partir de différents thread ?
Merci de votre aide
Partager