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
을 올바르게 반환합니다. 두 번째 예는 IndexOf
에서 -1
을 반환합니다.
편집 : 다음은 스택 트레이스의 pastebin 링크입니다. http://pastebin.com/TwfUDw4u
예외의 전체 스택 추적을 붙여 넣을 수 있습니까? TargetInvocationException은 일반적으로 다른 예외가 던져 졌음을 나타냅니다. 실제 예외를 알면 오류가 발생한 위치를 디버그하는 데 도움이됩니다. – cdhowie
@cdhowie 추가; 나는 그것에 의해 조금 당황 스럽다. – Corey
InnerException이란 무엇입니까? – SLaks