0

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

本质上,相同的代码片段在只采用单个参数的类方法上运行良好,所以我假设我对对象数组做错了,但我不知道是什么。

4

2 回答 2

1

一个更简单的处理方法是:

if (this.InvokeRequired)
{
    int rslt;
    this.Invoke((MethodInvoker) delegate
    {
        rslt = ReplaceMessage(msg, key);
    }
    return rslt;
}
于 2013-07-25T18:28:22.583 回答
0

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

我在函数体中弄乱了 String.Format,Invoke 将该异常传递给了我,但没有指明问题实际发生在代码中的哪个位置。

于 2013-07-25T19:42:49.120 回答