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);
}
どんなアドバイスでも大歓迎です。