Mancata corrispondenza del conteggio dei parametri
-
06-07-2019 - |
Domanda
Problemi con il seguente segmento di codice. Ricevo una mancata corrispondenza del conteggio dei parametri.
Ho dovuto scrivere questo a causa di problemi con più thread e aggiornamenti non sicuri.
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];
}
}
}
Soluzione
Suppongo che l'errore provenga da questa riga:
label_sensorValue.Invoke(del,new object[] {tokens[1]});
Passa solo un parametro a del ( token [1]
) ma ha due parametri (mittente ed e)
MODIFICA: dopo aver letto attentamente il codice, ti suggerisco di creare un metodo SetSensorValue
per impostare il valore di label_sensorValue
. In questo momento stai cercando di invocare il gestore eventi con parametri errati.
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;
}
}
Altri suggerimenti
Il tuo problema è che stai chiamando un delegato a due parametri con un solo parametro.
La seguente riga
label_sensorValue.Invoke(del,new object[] {tokens[1]});
richiama il delegato sul thread dell'interfaccia utente con il parametro tokens [1]
.
Poiché il delegato richiede due parametri, sta fallendo. Inoltre, il delegato si aspetta un oggetto
e un SerialDataReceivedEventArgs
, non una stringa.
Per risolvere questo problema, dovresti invocare un metodo anonimo invece del delegato.
Ad esempio (in C # 3):
label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));