2009-10-28 21 views
15

Probleme mit dem folgenden Codeabschnitt. Ich erhalte eine Abweichung der Parameteranzahl.Parameteranzahl stimmt nicht überein

Ich musste dies wegen der Probleme mit mehreren Threads und unsicheren Updates schreiben.


 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

die Fehler (entsprechend der C# Debugger) durch die Linie wird verursacht: label_sensorValue.Invoke (del, neues Objekt [] {Tokens [1 ]}); – BSchlinker

Antwort

16

Ich denke, der Fehler aus dieser Linie kommt:

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

Sie passieren nur einen Parameter zu del (tokens[1]), aber es hat zwei Parameter (Sender und e)

BEARBEITEN: nachdem ich Ihren Code sorgfältig gelesen habe, schlage ich vor, dass Sie eine SetSensorValue Methode erstellen, um den Wert von label_sensorValue festzulegen. Jetzt versuchen Sie, den Event-Handler mit falschen Parametern aufzurufen.

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

Ihr Problem besteht darin, dass Sie einen Delegaten mit zwei Parametern mit nur einem Parameter aufrufen.

Die folgende Zeile

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

ruft die Delegierten auf dem UI-Thread mit dem Parameter tokens[1].

Da der Delegat zwei Parameter benötigt, schlägt er fehl. Darüber hinaus erwartet der Delegat object und SerialDataReceivedEventArgs, kein String.

Um dies zu beheben, sollten Sie eine anonyme Methode anstelle des Delegaten aufrufen.

Zum Beispiel (in C# 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1])); 
Verwandte Themen