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];
            }
        }
    }
¿Fue útil?

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]));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top