2015-09-21 2 views
-1

Я пытаюсь изменить listview в фоновом рабочем документе.ArgumentOutOfRangeException in loop background worker

private void bw2_DoWork(object sender, DoWorkEventArgs e) 
    { 
     String temp = "aaaa"; 
     int n; 
     int nNet; 
     String[] ar = (String[])e.Argument; 
     int nList = int.Parse(ar[3]); 

     String tTrain = ar[0]; 
     String tPredic = ar[1]; 
     this.BeginInvoke(new MethodInvoker(() => { nList = inputList.Items.Count; })); 
     for (int i = 0; i < nList; i++) 
     { 
      Console.WriteLine(i); 
      ListViewItem.ListViewSubItem temp1 = new ListViewItem.ListViewSubItem(); 
      temp1.BackColor = Color.Green; 
      temp1.Text = "NORMAL"; 
      this.BeginInvoke(new MethodInvoker(() => { temp = String.Format("{0}\\{1}", dtrainTextBox.Text , inputList.Items[i].SubItems[1].Text); })); 
      // temp = String.Format("{0}\\{1}", tTrain, inputList.Items[i].SubItems[1].Text); 
      if (!File.Exists(temp)) 
      { 
       this.BeginInvoke(new MethodInvoker(delegate { inputList.Items[i].SubItems[1].BackColor = Color.Red; })); 
       // inputList.Items[i].SubItems[1].BackColor = Color.Red; 
       temp1.BackColor = Color.Red; 
       temp1.Text = "ERRO"; 
      } 
      this.BeginInvoke(new MethodInvoker(() => { temp = String.Format("{0}\\{1}", dpredicTextBox.Text, inputList.Items[i].SubItems[1].Text); })); 
      // temp = String.Format("{0}\\{1}", tPredic, inputList.Items[i].SubItems[2].Text); 
      if (!File.Exists(temp)) 
      { 
       this.BeginInvoke(new MethodInvoker(delegate { inputList.Items[i].SubItems[2].BackColor = Color.Red; })); 
       // inputList.Items[i].SubItems[2].BackColor = Color.Red; 
       temp1.BackColor = Color.Red; 
       temp1.Text = "ERRO"; 
      } 
      Console.WriteLine(String.Format("i:{0} nList:{1}",i,nList)); 
      this.BeginInvoke(new MethodInvoker(() => { temp = inputList.Items[i].SubItems[0].Text; })); 
      //temp = inputList.Items[i].SubItems[0].Text 
      Console.WriteLine(temp); 
      if (int.TryParse(temp, out n) & int.TryParse(ar[2], out nNet)) 
      { 
       if (n > nNet) 
       { 
        this.BeginInvoke(new MethodInvoker(delegate { inputList.Items[i].SubItems[0].BackColor = Color.Red; })); 
       // inputList.Items[i].SubItems[0].BackColor = Color.Red; 
        temp1.BackColor = Color.Red; 
        temp1.Text = "ERRO"; 
       } 
      } 
      else 
      { 
       this.BeginInvoke(new MethodInvoker(delegate { inputList.Items[i].SubItems[0].BackColor = Color.Red; })); 
       // inputList.Items[i].SubItems[0].BackColor = Color.Red; 
       temp1.BackColor = Color.Red; 
       temp1.Text = "ERRO"; 
      } 

      this.BeginInvoke(new MethodInvoker(delegate{inputList.Items[i].SubItems.Add(temp1);})); 
     } 
    } 

Проблема заключается в том, что nList в случае я тестирую nList = 2060, и я получаю ошибку в одном из inputList.Items[i]:

Необработанное исключение типа «System.ArgumentOutOfRangeException» произошел в System.Windows.Forms.dll Дополнительная информация: InvalidArgument = Значение '2060' недопустимо для 'index'.

Я не знаю, как это происходит, последнее значение «я» должно быть 2059, как он пытается получить доступ к этому показателю 2060 NLIST имеет значение inputList.Items.Count, я передал его как аргумент, так что мне не нужно будет использовать invoke, чтобы получить его счет.

Я просто попытался это:

private void loadButton_Click(object sender, EventArgs e) 
    { 
     object[] ar = { dpredicTextBox.Text, dpredicTextBox.Text, nNet.Items.Count, inputList}; 
     bw3.RunWorkerAsync(ar); 
    } 
private void bw3_DoWork(object sender, DoWorkEventArgs e) 
    { 
     String temp = "aaaa"; 
     int n; 
     object[] ar = (Object[])e.Argument; 
     ListView nList = (ListView) ar[3]; 
     int nNet = (int)ar[2]; 
     String tTrain = (String) ar[0]; 
     String tPredic = (String) ar[1]; 
     foreach(ListViewItem item in nList.Items) 
     { 
      ListViewItem.ListViewSubItem temp1 = new ListViewItem.ListViewSubItem(); 
      temp1.BackColor = Color.Green; 
      temp1.Text = "NORMAL"; 
      temp = String.Format("{0}\\{1}", tTrain, item.SubItems[1].Text); 
      if (!File.Exists(temp)) 
      { 

       item.SubItems[1].BackColor = Color.Red; 
       temp1.BackColor = Color.Red; 
       temp1.Text = "ERRO"; 
      } 
      temp = String.Format("{0}\\{1}", tPredic, item.SubItems[2].Text); 
      if (!File.Exists(temp)) 
      { 
       item.SubItems[2].BackColor = Color.Red; 
       temp1.BackColor = Color.Red; 
       temp1.Text = "ERRO"; 
      } 
      temp = item.SubItems[0].Text; 
      if (int.TryParse(temp, out n)) 
      { 
       if (n > nNet) 
       { 
        item.SubItems[0].BackColor = Color.Red; 
        temp1.BackColor = Color.Red; 
        temp1.Text = "ERRO"; 
       } 
      } 
      else 
      { 
       item.SubItems[0].BackColor = Color.Red; 
       temp1.BackColor = Color.Red; 
       temp1.Text = "ERRO"; 
      } 
      item.SubItems.Add(temp1); 
      this.BeginInvoke(new MethodInvoker(delegate { inputList = nList; })); 
     } 
     // this.BeginInvoke(new MethodInvoker(delegate { inputList = nList; })); 
    } 

Но его тоже не работает:

Исключение типа «System.InvalidOperationException» произошло в System.Windows.Forms.dll, но не обрабатывается пользователем код

Дополнительная информация: Неверная операция поперечного потока: элемент управления 'inputList' доступен из потока, отличного от потока, на котором он был создан.

+0

Почему вы не используете 'i hofmeister

+0

@hofmeister Я думаю, вы имеете в виду 'i juharr

+0

nList имеет inputList.Items.Count значение – kadzu

ответ

0

Вместо BeginInvoke, который является асинхронным, используйте Invoke. Счетчик i фактически становится 2060 в конце цикла, и это может произойти до того, как inputList.Items[i] получите ссылку в одном из ваших асинхронных вызовов. Вызов метода Invoke в элементе управления WinForms ожидает завершения вызова и делает поведение цикла, как вы ожидаете. Второй образец кода не работает, поскольку элементы управления WinForms нельзя «коснуться» из фонового потока. Доступ к ним возможен только из основного (или графического) потока.