Multithreading 线程的奇怪行为

Multithreading 线程的奇怪行为,multithreading,invoke,invokerequired,Multithreading,Invoke,Invokerequired,我正在编写一个应用程序,它使用MODBUS协议与某些硬件进行通信。 我使用的是来自代码项目的示例 在尝试优化代码(主要是PollFunction函数)时,我遇到了一个非常奇怪的线程锁 我不是将每行字符串发送到DoGUIUpdatedelagate,而是构建一个字符串数组并将其作为一个整体发送 这样做会导致应用程序崩溃,出现System.Reflection.targetParametercountException:参数计数不匹配错误 原代码: public delegate void GUIU

我正在编写一个应用程序,它使用MODBUS协议与某些硬件进行通信。
我使用的是来自代码项目的示例

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

我不是将每行字符串发送到
DoGUIUpdate
delagate,而是构建一个字符串数组并将其作为一个整体发送

这样做会导致应用程序崩溃,出现
System.Reflection.targetParametercountException:参数计数不匹配
错误

原代码:

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委托无效GUIUpdate(string-paramString);
公共void DoGUIUpdate(字符串paramString)
{
如果(需要调用)
BeginInvoke(新GUI更新(DoGUIUpdate),参数字符串);
其他的
lstRegisterValues.Items.Add(paramString);
}
私有函数()
{
...
字符串项字符串;
for(int i=0;i
我的代码:

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);
}
public委托void GUIUpdate2(string[]paramString);
public void DoGUIUpdate2(字符串[]paramString)
{
如果(需要调用)
BeginInvoke(新的GUIUpdate2(DoGUIUpdate2),paramString);
其他的
{
lstRegisterValues.Items.Clear();
lstRegisterValues.Items.AddRange(paramString);
}
}
字符串[]值字符串;
私有函数()
{
...
ValuesString=新字符串[pollLength];
for(int i=0;i
欢迎任何建议。

我认为
BeginInvoke(新的GUIUpdate2(DoGUIUpdate2),paramString)是问题所在

“begininvoke”的第二个参数接受一个
param对象[]params
,这将导致调用
DoGuiUpdate(string1、string2、string3)
,这不是您想要的

尝试用以下方式封装:

BeginInvoke(new GUIUpdate2(DoGUIUpdate2), new[]{ paramString });