我正在尝试修改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
答案 0 :(得分:0)
this.BeginInvoke(m,new [] {oldClass,newClass});
顺便说一句。好的做法是在使用Invoke之前测试if(this.IsHandleCreated&&!this.IsDisposed)。