Я пытаюсь изменить поле со списком в приложении 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
.
Редактировать: Здесь находится ссылка pasteshin из stacktrace. http://pastebin.com/TwfUDw4u
Можете ли вы вставить полную трассировку стека исключения? TargetInvocationException обычно указывает, что какое-то исключение было выброшено в другое место, и оно было завернуто. Знание реального исключения и того, где это произошло, поможет отладить. – cdhowie 2010-11-24 17:07:13
@cdhowie Добавлено; Я немного озадачен этим. – Corey 2010-11-24 17:15:50