我正在编写一个使用MODBUS协议与某些硬件通信的应用程序 我正在使用Code Project中的this示例。
在尝试优化代码(主要是PollFunction
函数)时,我遇到了一个非常奇怪的线程锁。
我没有将每一行字符串发送到DoGUIUpdate
delagate,而是构建一个字符串数组并将其作为一个整体发送。
这样做会导致应用程序出现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);
}
欢迎任何建议。
答案 0 :(得分:0)
我认为BeginInvoke(new GUIUpdate2(DoGUIUpdate2), paramString);
是问题......
“begininvoke”的第二个参数接受param object[] params
,这将导致调用DoGuiUpdate(string1,string2,string3)
,这不是你想要的......
尝试以下列方式封装:
BeginInvoke(new GUIUpdate2(DoGUIUpdate2), new[]{ paramString });