2009-10-28 15 views
15

Tiene problemas con el siguiente segmento de código. Estoy obteniendo un desajuste en el conteo de parámetros.Parameter Count Mismatch

Tuve que escribir esto debido a problemas con varios subprocesos y actualizaciones inseguras.


 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

El error (de acuerdo con el C# depurador) está siendo causado por la línea: label_sensorValue.Invoke (del, nuevo objeto [] {tokens [1 ]}); – BSchlinker

Respuesta

16

supongo que el error proviene de esta línea:

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

Se pasa un solo parámetro a del (tokens[1]) pero tiene dos parámetros (emisor y e)

EDITAR: después de leer cuidadosamente su código, le sugiero que cree un método SetSensorValue para establecer el valor de label_sensorValue. En este momento, intenta invocar el controlador de eventos con parámetros incorrectos.

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

Su problema es que llama a un delegado de dos parámetros con un solo parámetro.

La siguiente línea

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

invoca el delegado en el subproceso de interfaz de usuario con el parámetro tokens[1].

Como el delegado necesita dos parámetros, está fallando. Además, el delegado espera un object y un SerialDataReceivedEventArgs, no una cadena.

Para solucionar esto, debe invocar un método anónimo en lugar del delegado.

Por ejemplo (en C# 3):

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