2010-11-24 2 views
0

Ich versuche, ein Kombinationsfeld in meiner WinForms-Anwendung zu ändern, und ich bekomme seltsames Verhalten. Ich versuche, zwei Methoden:Wie unterscheiden sich diese beiden Aufrufe?

Hier ist die Methode, die ich aufrufen müssen:

private void modifyCombo(ClassInfoHolder oldClass, ClassInfoHolder newClass) { 
    this.monitoredComboBox.Items[monitoredComboBox.Items.IndexOf(oldClass)] = newClass; 
} 

Ich versuche, zwei verschiedene Wege, diese Methode aus dem GUI-Thread aufzurufen. Dieses funktioniert:

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); 
    } 
} 

Und das wirft ein TargetInvocationException:

this.BeginInvoke(new Action(() => { 
    modifyCombo(oldClass, newClass); 
})); 

Ich würde es vorziehen, die zweite zu verwenden, weil es ist viel klarer, aber ich bin mir nicht ganz sicher, warum es einen Fehler auslöst, wenn Das erste Beispiel funktioniert gut. Das erste Beispiel ruft die Methode modifyCombo auf und gibt das IndexOf des Objekts korrekt zurück. Das zweite Beispiel wird -1 von IndexOf zurückgegeben.

Edit: Hier ist ein Pastebin Link des Stacktrace.

+3

Können Sie den vollständigen Stack-Trace der Ausnahme einfügen? TargetInvocationException gibt normalerweise an, dass eine Ausnahme an anderer Stelle ausgelöst wurde und dass sie umbrochen wurde. Das Erkennen der echten Ausnahme und wo es passiert ist, hilft beim Debuggen. – cdhowie

+0

@cdhowie Hinzugefügt; Ich bin ein wenig verblüfft. – Corey

+0

Was ist die InnerException? – SLaks

Antwort

0

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

BTW. Eine gute Vorgehensweise besteht darin, zu testen, ob (this.IsHandleCreated & &! This.IsDisposed) vor der Verwendung von Invoke.

+0

Ich habe versucht, es in einen 'If (überwachtenComboBox.InvokeRequired) {invoke} else {nicht invoke}' Typ Block, ohne Glück. – Corey

+0

Und was? Sind Sie sicher, dass im überwachten Fall monitoredComboBox.InvokeRequired true zurückgibt? Ich spreche darüber –

+0

Ja, InvokeRequired gibt in beiden Fällen – Corey