0

我正在编写一个使用 MODBUS 协议与某些硬件通信的应用程序。
我正在使用代码项目中的这个示例。

在尝试优化代码(主要是PollFunction函数)时,我遇到了一个非常奇怪的线程锁。

我没有将每一行字符串发送到DoGUIUpdatedelagate,而是构建一个字符串数组并将其作为一个整体发送。

这样做会导致应用程序因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”的第二个参数接受 aparam object[] params这将导致调用DoGuiUpdate(string1,string2,string3)不是你想要的......

尝试按以下方式封装:

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