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 was unhandled」「Index (zero based) must not greater than zero and equal to the size of the argument list.」という例外が発生します。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 に答える