参数计数不匹配
问题描述:
在以下代码段遇到问题。我得到一个参数计数不匹配。参数计数不匹配
我不得不写这个,因为多线程和不安全更新的问题。
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];
}
}
}
答
我猜的错误来源于此行:
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;
}
}
答
你的问题是你只用一个参数调用双参数委托。
下面的行
label_sensorValue.Invoke(del,new object[] {tokens[1]});
调用与参数tokens[1]
UI线程上的委托。
由于委托需要两个参数,所以它失败了。此外,代表期望object
和SerialDataReceivedEventArgs
,而不是字符串。
要解决此问题,您应该调用匿名方法而不是委托。
例如(在C#3): label_sensorValue.Invoke(DEL,新的对象[] {令牌[1:
label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
误差(根据C#调试器)正在由线引起]}); – BSchlinker 2009-10-28 11:23:19