2009-10-28 15 views
15

Problemi con il seguente segmento di codice. Sto riscontrando una mancata corrispondenza del conteggio dei parametri.Parametro Count Mismatch

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]; 
      } 
     } 
    } 
+0

L'errore (secondo il C# debugger) è causato dalla linea: label_sensorValue.Invoke (DEL, nuovo oggetto [] {gettoni [1 ]}); – BSchlinker

risposta

16

Credo che l'errore viene da questa linea:

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

Si passa un solo parametro per del (tokens[1]) ma ha due parametri (mittente ed e)

EDIT: dopo aver letto attentamente il codice, ti suggerisco di creare un metodo SetSensorValue per impostare il valore di label_sensorValue. In questo momento stai provando a richiamare il gestore di 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; 
    } 
} 
4

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

invoca il delegato sul thread UI con il parametro tokens[1].

Poiché il delegato richiede due parametri, non funziona. Inoltre, il delegato si aspetta un object e un SerialDataReceivedEventArgs, non una stringa.

Per risolvere questo problema, è necessario richiamare un metodo anonimo anziché delegato.

Per esempio (in C# 3):

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