El parámetro cuenta la falta de coincidencia
-
06-07-2019 - |
Pregunta
Tiene problemas con el siguiente segmento de código. Estoy obteniendo un error en el recuento de parámetros.
Tuve que escribir esto debido a problemas con múltiples hilos y actualizaciones inseguras.
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];
}
}
}
Solución
Supongo que el error proviene de esta línea:
label_sensorValue.Invoke(del,new object[] {tokens[1]});
Solo pasa un parámetro a del ( tokens [1]
) pero tiene dos parámetros (remitente y e)
EDITAR: después de leer cuidadosamente su código, le sugiero que cree un método SetSensorValue
para establecer el valor de label_sensorValue
. En este momento está intentando invocar el controlador de eventos con parámetros incorrectos.
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;
}
}
Otros consejos
Su problema es que está llamando a un delegado de dos parámetros con un solo parámetro.
La siguiente línea
label_sensorValue.Invoke(del,new object[] {tokens[1]});
invoca al delegado en el hilo de la IU con el parámetro tokens [1]
.
Dado que el delegado requiere dos parámetros, está fallando. Además, el delegado espera un objeto
y un SerialDataReceivedEventArgs
, no una cadena.
Para solucionar esto, debe invocar un método anónimo en lugar del delegado.
Por ejemplo (en C # 3):
label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));