BSc*_*ker 16 c# parameters count mismatch
遇到以下代码段时遇到问题.我得到的参数计数不匹配.
由于多线程和不安全更新的问题,我不得不写这个.
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];
}
}
}
Run Code Online (Sandbox Code Playgroud)
ybo*_*ybo 17
我想错误来自这一行:
label_sensorValue.Invoke(del,new object[] {tokens[1]});
Run Code Online (Sandbox Code Playgroud)
您只将一个参数传递给del(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;
}
}
Run Code Online (Sandbox Code Playgroud)
您的问题是您正在调用一个只有一个参数的双参数委托。
以下行
label_sensorValue.Invoke(del,new object[] {tokens[1]});
Run Code Online (Sandbox Code Playgroud)
使用参数调用 UI 线程上的委托tokens[1]
。
由于委托需要两个参数,所以它失败了。此外,委托需要一个object
和一个SerialDataReceivedEventArgs
,而不是一个字符串。
要解决此问题,您应该调用匿名方法而不是委托。
例如(在 C# 3 中):
label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
56675 次 |
最近记录: |