Я пытаюсь изменить 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' доступен из потока, отличного от потока, на котором он был создан.
Почему вы не используете 'i
hofmeister
@hofmeister Я думаю, вы имеете в виду 'i
juharr
nList имеет inputList.Items.Count значение – kadzu