0

MODBUS プロトコルを使用して一部のハードウェアと通信するアプリケーションを作成しています。Code Project のこのサンプル
を使用しています。

コード (主にPollFunction関数) を最適化しようとしているときに、非常に奇妙なスレッド ロックに遭遇しました。

文字列の各行をデリゲートに送信する代わりにDoGUIUpdate、文字列配列を作成して全体として送信しています。

これを行うと、アプリケーションがエラーでクラッシュしSystem.Reflection.targetParametercountException: Parameter count mismatchます。

元のコード:

public delegate void GUIUpdate(string paramString);
public void DoGUIUpdate(string paramString)
{
    if (InvokeRequired)
        BeginInvoke(new GUIUpdate(DoGUIUpdate), paramString);
    else
        lstRegisterValues.Items.Add(paramString);
}

private void PollFunction()
{
    ...
    string itemString;
    for (int i = 0; i < pollLength; i++)
    {
        itemString = "[" + Convert.ToString(pollStart + i + 40001) + "] , MB[" + Convert.ToString(pollStart + i) + "] = " + values[i];
        DoGUIUpdate(itemString);
    }
}

私のコード:

public delegate void GUIUpdate2(string[] paramString);
public void DoGUIUpdate2(string[] paramString)
{
    if (InvokeRequired)
        BeginInvoke(new GUIUpdate2(DoGUIUpdate2), paramString);
    else
    {
        lstRegisterValues.Items.Clear();
        lstRegisterValues.Items.AddRange(paramString);
    }
}

string[] valuesStrings;
private void PollFunction()
{
    ...
    valuesStrings = new string[pollLength];
    for (int i = 0; i < pollLength; i++)
    {
        valuesStrings[i] = "[" + Convert.ToString(pollStart + i + 40001) + "] , MB[" + Convert.ToString(pollStart + i) + "] = " + values[i];
    }
    DoGUIUpdate2(valuesStrings);
}

どんなアドバイスでも大歓迎です。

4

1 に答える 1

0

が問題だと思いますBeginInvoke(new GUIUpdate2(DoGUIUpdate2), paramString);...

「begininvoke」の 2 番目のパラメータは、必要なparam object[] paramsコールDoGuiUpdate(string1,string2,string3)ではない結果になる を受け入れます...

次の方法でカプセル化してみてください。

BeginInvoke(new GUIUpdate2(DoGUIUpdate2), new[]{ paramString });
于 2012-08-26T07:33:27.820 に答える