我正在尝试从不同的线程调用Form方法。在表单类中,我有:
delegate int ReplaceMessageCallback(string msg, int key);
public int ReplaceMessage(string msg, int key)
{
if (this.InvokeRequired)
{
ReplaceMessageCallback amc = new ReplaceMessageCallback(ReplaceMessage);
object[] o = new object[] { msg, key };
return (int)this.Invoke(amc, o);
}
bool found = false;
int rv;
lock (this)
{
if (key != 0)
{
found = RemoveMessage(key);
}
if (found)
{
rv = AddMessage(msg, key);
}
else
{
rv = AddMessage(msg);
}
}
MainForm.EventLogInstance.WriteEntry((found)
? EventLogEntryType.Information
: EventLogEntryType.Warning,
IntEventLogIdent.MessageFormReplace1,
String.Format("MessageForm::ReplaceMessage(({2},{0}) returns {1}.\n\n(The message {3} exist to be replaced.)",
key,
rv,
msg,
(found)
? "did"
: "did not"));
return rv;
}
当我运行它时,我得到一个异常“FormatException未处理”“索引(从零开始)必须大于或等于零且小于参数列表的大小。”在调用Invoke。
基本上这个相同的代码片段在只接受单个参数的类方法上工作正常,所以我假设我对对象数组做错了但我不知道是什么。
答案 0 :(得分:1)
处理此问题的更简单方法是:
if (this.InvokeRequired)
{
int rslt;
this.Invoke((MethodInvoker) delegate
{
rslt = ReplaceMessage(msg, key);
}
return rslt;
}
答案 1 :(得分:0)
事实证明,调用调用将传递它调用的函数中的异常,并且您无法步进(调试器中的F11)。我假设它会进入被调用的代码,所以当它失败时我认为它是实际的Invoke调用。
我在函数体中混淆了一个String.Format,并且Invoke将该异常传递给了我,并没有指出问题实际发生在代码中的哪个位置。