Проблема в том, что ваш анонимный метод захватывает i
- поэтому к тому моменту, когда фактически вызывается в потоке пользовательского интерфейса, вы получаете другое значение i
, которое может быть нулевым , Попробуйте это:
for (int i = 0; i < frmChildren.Length; i++)
{
ChildGUI control = frmChildren[i];
if (control != null)
{
control.BeginInvoke(new EventHandler(delegate
{
control.Close();
}));
}
}
frmChildren = new ChildGUI[20];
См. сообщение в блоге Эрика Липперта о том, почему введение новой переменной в цикл устраняет проблему.
РЕДАКТИРОВАТЬ: Если вы хотите использовать цикл foreach
, это будет выглядеть так:
foreach (ChildGUI control in frmChildren)
{
// Create a "new" variable to be captured
ChildGUI copy = control;
if (copy != null)
{
copy.BeginInvoke(new EventHandler(delegate
{
copy.Close();
}));
}
}
frmChildren = new ChildGUI[20];
Кроме того, вы можете использовать тот факт, что вы просто хотите вызвать метод void, чтобы сделать код немного проще. Поскольку при этом больше не используется анонимный метод, вы можете обойтись без «внутренней» переменной:
foreach (ChildGUI control in frmChildren)
{
if (control != null)
{
control.BeginInvoke(new MethodInvoker(control.Close));
}
}
frmChildren = new ChildGUI[20];