使用多个参数调用,导致FormatException

时间:2013-07-25 17:35:44

标签: c# invoke

我正在尝试从不同的线程调用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。

基本上这个相同的代码片段在只接受单个参数的类方法上工作正常,所以我假设我对对象数组做错了但我不知道是什么。

2 个答案:

答案 0 :(得分:1)

处理此问题的更简单方法是:

if (this.InvokeRequired)
{
    int rslt;
    this.Invoke((MethodInvoker) delegate
    {
        rslt = ReplaceMessage(msg, key);
    }
    return rslt;
}

答案 1 :(得分:0)

事实证明,调用调用将传递它调用的函数中的异常,并且您无法步进(调试器中的F11)。我假设它会进入被调用的代码,所以当它失败时我认为它是实际的Invoke调用。

我在函数体中混淆了一个String.Format,并且Invoke将该异常传递给了我,并没有指出问题实际发生在代码中的哪个位置。