Incompatibilité du nombre de paramètres
-
06-07-2019 - |
Question
Avoir des problèmes avec le segment de code suivant. Je reçois une incompatibilité entre les paramètres
J'ai dû écrire ceci en raison de problèmes liés à plusieurs threads et à des mises à jour non sécurisées.
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];
}
}
}
La solution
Je suppose que l'erreur vient de cette ligne:
label_sensorValue.Invoke(del,new object[] {tokens[1]});
Vous ne transmettez qu'un seul paramètre à del ( jetons [1]
), mais il comporte deux paramètres (expéditeur et e)
EDIT: après avoir lu attentivement votre code, je vous suggère de créer une méthode SetSensorValue
pour définir la valeur de label_sensorValue
. À l’heure actuelle, vous essayez d’appeler le gestionnaire d’événements avec des paramètres incorrects.
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;
}
}
Autres conseils
Votre problème est que vous appelez un délégué à deux paramètres avec un seul paramètre.
La ligne suivante
label_sensorValue.Invoke(del,new object[] {tokens[1]});
appelle le délégué sur le thread d'interface utilisateur avec le paramètre jetons [1]
.
Le délégué ayant besoin de deux paramètres, il échoue. De plus, le délégué attend un objet
et un SerialDataReceivedEventArgs
, et non une chaîne.
Pour résoudre ce problème, vous devez appeler une méthode anonyme au lieu du délégué.
Par exemple (en C # 3):
label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));