2010-10-27 5 views
3

Dans une vue de données, j'ai un champ d'adresse IP. lorsque je clique sur le bouton check status, je crée un thread pour chaque ligne dans datagridview puis j'appelle un objet distant sur l'hôte sur cette adresse IP et j'obtiens des informations et je mets un autre champ datagridview comme information.Pass Parameter to thread problem

mais il y a un problème. l'information est mal définie sur datagridview. Pourquoi?

private void button_CheckStatus_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < dataGridView.Rows.Count; i++) 
     { 
      IPAddress IP; 
      if (IsValidIP(dataGridView["IP", i].Value.ToString(), out IP)) 
      { 
       Thread t = new Thread(() => CheckStatusThreadFunction(IP, i)); 
       t.Start(); 
      } 
     } 

    } 
+0

Comment est-il mal réglé? Quels résultats attendez-vous et comment les résultats réels diffèrent-ils des résultats attendus? –

+0

le texte de l'information d'obtenir devrait placer devant la rangée je mais quelquefois il est placé sur la prochaine ou la deuxième rangée ci-dessous. –

Répondre

2

Assurez-vous de ne pas saisir la variable de la boucle:

for (int i = 0; i < dataGridView_VSD.Rows.Count; i++) 
    { 
     int ii = i; 
     IPAddress IP; 
     if (IsValidIP(dataGridView_VSD["VSD_IP", i].Value.ToString(), out IP)) 
     { 
      Thread t = new Thread(() => CheckVSDStatusThreadFunction(IP, ii)); 
      t.Start(); 
     } 
    } 

C'est une erreur très commune.

Voir par exemple. here

+0

J'ai utilisé cette solution mais pourquoi ça devrait être correct ??? –

+0

@HPT: ajout d'un lien vers ma réponse. – Henrik

+0

@HPT, voir [cet article] (http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx) pour un explication. Tous vos délégués anonymes capturent la même variable 'i', donc elle a la même valeur pour chacun d'eux. –