Parameter Count Mismatch
-
06-07-2019 - |
Frage
Probleme mit dem folgende Codesegment zu haben. Ich bin ein Parameteranzahl Mismatch zu bekommen.
Ich hatte dies mit mehreren Threads und unsicherem Updates aufgrund von Problemen zu schreiben.
delegate void data_INPUTDelegate(object sender, System.IO.Ports.SerialDataReceivedEventArgs e);
private void data_INPUT(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string data = serialPort.ReadLine();
string[] tokens = data.Split(':');
if (tokens[0] == "$SENSOR")
{
if (label_sensorValue.InvokeRequired)
{
data_INPUTDelegate del = new data_INPUTDelegate(data_INPUT);
label_sensorValue.Invoke(del,new object[] {tokens[1]});
}
else
{
label_sensorValue.Text = tokens[1];
}
}
}
Lösung
Ich denke, der Fehler kommt aus dieser Zeile:
label_sensorValue.Invoke(del,new object[] {tokens[1]});
Sie passieren nur einen Parameter zu del (tokens[1]
), aber es hat zwei Parameter (Sender und e)
EDIT: nach Ihrem Code sorgfältig zu lesen, schlage ich vor, dass Sie eine SetSensorValue
Methode erstellen Sie den Wert von label_sensorValue
einzustellen. Gerade jetzt Sie versuchen, die Event-Handler mit falschen Parametern aufgerufen werden kann.
private void data_INPUT(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string data = serialPort.ReadLine();
string[] tokens = data.Split(':');
if (tokens[0] == "$SENSOR")
{
SetSensorValue(tokens[1]);
}
}
delegate void SetSensorValueDelegate(string value);
private void SetSensorValue(string value)
{
if (label_sensorValue.InvokeRequired)
{
SetSensorValueDelegate del = new SetSensorValueDelegate(SetSensorValue);
label_sensorValue.Invoke(del, new object[] {value});
}
else
{
label_sensorValue.Text = value;
}
}
Andere Tipps
Ihr Problem ist, dass man mit nur einem Parameter, der ein Zwei-Parameter-Delegierten ist aufgerufen wird.
Die folgende Zeile
label_sensorValue.Invoke(del,new object[] {tokens[1]});
ruft die Delegierten auf dem UI-Thread mit dem Parameter tokens[1]
.
Da die Delegierten zwei Parameter erfordert, wird es scheitern. Darüber hinaus erwartet die Delegierten eine object
und SerialDataReceivedEventArgs
, kein String.
Um dies zu beheben, sollten Sie eine anonyme Methode anstelle des Delegaten aufrufen.
Zum Beispiel (in C # 3):
label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));