2010-11-24 2 views
0

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

+3

예외의 전체 스택 추적을 붙여 넣을 수 있습니까? TargetInvocationException은 일반적으로 다른 예외가 던져 졌음을 나타냅니다. 실제 예외를 알면 오류가 발생한 위치를 디버그하는 데 도움이됩니다. – cdhowie

+0

@cdhowie 추가; 나는 그것에 의해 조금 당황 스럽다. – Corey

+0

InnerException이란 무엇입니까? – SLaks

답변

0

this.BeginInvoke (m, new [] {oldClass, newClass});

BTW. 좋은 연습은 사용하기 전에 (this.IsHandleCreated & &! this.IsDisposed)를 테스트하는 것입니다.

+0

행운을 들이지 않고'if (monitoredComboBox.InvokeRequired) {invoke} else {not invoke}'타입 블록에 랩핑을 시도했습니다. – Corey

+0

그리고 뭐라구? 첫 번째 경우 monitoredComboBox.InvokeRequired가 true를 반환합니까? 나는 그것에 대해 이야기하고있다 –

+0

예, InvokeRequired는 두 경우 모두 true를 반환합니다. – Corey

관련 문제