Pergunta

Tendo problemas com o seguinte segmento de código. Eu estou recebendo uma incompatibilidade contagem de parâmetro.

Eu tive que escrever isso por causa de problemas com vários segmentos e actualizações 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];
            }
        }
    }
Foi útil?

Solução

Eu acho que o erro vem dessa linha:

label_sensorValue.Invoke(del,new object[] {tokens[1]});

Você passa apenas um parâmetro para del (tokens[1]) mas tem dois parâmetros (remetente e e)

EDIT: depois de ler cuidadosamente o seu código, eu sugiro que você crie um método SetSensorValue para definir o valor de label_sensorValue. Agora que você está tentando chamar o manipulador de evento com parâmetros errados.

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

Outras dicas

Seu problema é que você está chamando um delegado de dois parâmetros com apenas um parâmetro.

A seguinte linha

label_sensorValue.Invoke(del,new object[] {tokens[1]});

invoca o delegado no thread UI com o tokens[1] parâmetro.

Uma vez que o delegado requer dois parâmetros, ele está falhando. Além disso, o delegado espera um object e uma SerialDataReceivedEventArgs, não uma string.

Para corrigir isso, você deve invocar um método anônimo em vez do delegado.

Por exemplo (em C # 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top