2009-10-28 89 views
15

在以下代码段遇到问题。我得到一个参数计数不匹配。参数计数不匹配

我不得不写这个,因为多线程和不安全更新的问题。


 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

误差(根据C#调试器)正在由线引起]}); – BSchlinker 2009-10-28 11:23:19

回答

16

我猜的错误来源于此行:

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

你只传递一个参数德尔(tokens[1]),但它有两个参数(sender和e)

编辑:仔细阅读你的代码后,我建议你创建一个SetSensorValue方法来设置值为label_sensorValue。现在你试图用错误的参数调用事件处理程序。

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

你的问题是你只用一个参数调用双参数委托。

下面的行

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

调用与参数tokens[1] UI线程上的委托。

由于委托需要两个参数,所以它失败了。此外,代表期望objectSerialDataReceivedEventArgs,而不是字符串。

要解决此问题,您应该调用匿名方法而不是委托。

例如(在C#3): label_sensorValue.Invoke(DEL,新的对象[] {令牌[1:

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