Я пытаюсь изменить поле со списком в моем приложении WinForms, и у меня странное поведение. Я пробую два метода:
Вот метод, который мне нужно вызвать:
private void modifyCombo(ClassInfoHolder oldClass, ClassInfoHolder newClass) {
this.monitoredComboBox.Items[monitoredComboBox.Items.IndexOf(oldClass)] = newClass;
}
Я пытаюсь двумя разными способами вызвать этот метод из потока GUI. Это работает:
delegate void modifyComboCollection(ClassInfoHolder oldClass, ClassInfoHolder newClass);
private void modifySecondTabComboBox(ClassInfoHolder oldClass, ClassInfoHolder newClass) {
if (monitoredComboBox.InvokeRequired) {
modifyComboCollection m = new modifyComboCollection(modifyCombo);
this.BeginInvoke(m, oldClass, newClass);
} else {
// no need for Invoke
modifyCombo(oldClass, newClass);
}
}
И это вызывает исключение TargetInvocationException:
this.BeginInvoke(new Action(() => {
modifyCombo(oldClass, newClass);
}));
Я бы предпочел использовать второй, потому что он намного понятнее, но я не совсем уверен, почему он выдает ошибку, когда первый пример работает просто отлично. Первый пример вызывает метод modifyCombo
и правильно возвращает IndexOf
объекта. Второй пример возвращается -1
из IndexOf
.
Редактировать: вот ссылка на вставку из трассировки стека.
http://pastebin.com/TwfUDw4u