2010-10-27 2 views
3

В datagridview у меня есть поле IP-адреса. , когда я нажимаю кнопку состояния проверки. Я делаю поток для каждой строки в datagridview, а затем вызываю удаленный объект на хосте на этом IP-адресе и получаю некоторую информацию и устанавливаю другое поле datagridview в качестве этой информации.Pass Параметр для проблемы с потоком

но есть проблема. информация неверно установлена ​​на datagridview. Зачем?

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

Как это неправильно установлено? Какие результаты вы ожидаете и как фактические результаты отличаются от ожидаемых результатов? –

+0

текст из get info должен быть установлен перед строкой i, но иногда он устанавливается на следующей или второй строке ниже. – 2010-10-27 13:20:18

ответ

2

Убедитесь, что не захватить переменный цикл:

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

Это очень распространенная ошибка.

См., Например, here

+0

Я использовал это решение, но почему это должно быть правильно ??? – 2010-10-27 13:18:39

+0

@HPT: добавлена ​​ссылка на мой ответ. – Henrik

+0

@HPT, см. [Эту статью] (http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx) для объяснение. Все ваши анонимные делегаты захватывают одну и ту же переменную 'i', поэтому она имеет одинаковое значение для всех из них. –

Смежные вопросы