0

I’m writing an application that communicates with some hardware using the MODBUS protocol.
I'm using this sample from Code Project.

While trying to optimize the code (mainly the PollFunction function), I've encountered with a very strange threads lock.

Instead of sending each line of string to the DoGUIUpdate delagate, I'm constructing a string array and sending it as a whole.

Doing so causes the application to crush with a System.Reflection.targetParametercountException: Parameter count mismatch error.

The original code:

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);
    }
}

My code:

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);
}

Any advice will be welcome.

toy4fun
  • 839
  • 2
  • 14
  • 33

1 Answers1

0

i think BeginInvoke(new GUIUpdate2(DoGUIUpdate2), paramString); is the problem...

the second parameter of "begininvoke" accepts a param object[] params which will result in the call DoGuiUpdate(string1,string2,string3) which is not what you want...

try encapsulate in the following way:

BeginInvoke(new GUIUpdate2(DoGUIUpdate2), new[]{ paramString });
TheHe
  • 2,933
  • 18
  • 22