Parâmetro Contagem Incompatibilidade
-
06-07-2019 - |
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];
}
}
}
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]));