这两个调用有何不同?

时间:2010-11-24 17:04:17

标签: c# winforms targetinvocationexception

我正在尝试修改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

编辑:这是堆栈跟踪的pastebin链接。 http://pastebin.com/TwfUDw4u

1 个答案:

答案 0 :(得分:0)

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

顺便说一句。好的做法是在使用Invoke之前测试if(this.IsHandleCreated&&!this.IsDisposed)。

相关问题