2009-10-28 9 views
15

Problème avec le segment de code suivant. J'obtiens un décalage de compte de paramètre.Incompatibilité du nombre de paramètres

J'ai dû écrire cela à cause de problèmes avec 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]; 
      } 
     } 
    } 
+0

L'erreur (selon le débogueur C#) est causé par la ligne: label_sensorValue.Invoke (del, nouvel objet [] {jetons [1 ]}); – BSchlinker

Répondre

16

Je suppose que l'erreur vient de cette ligne:

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

Vous passez un seul paramètre à del (tokens[1]), mais il a deux paramètres (émetteur 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; 
    } 
} 
4

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

invoque le délégué sur le thread d'interface avec le paramètre tokens[1].

Étant donné que le délégué nécessite deux paramètres, il échoue. En outre, le délégué attend un object et un SerialDataReceivedEventArgs, pas une chaîne. Pour résoudre ce problème, vous devez appeler une méthode anonyme à la place du délégué.

Par exemple (en C# 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1])); 
Questions connexes