遇到以下代码段问题。我的参数计数不匹配。

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


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

您只将一个参数传递给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;
    }
}

其他提示

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

以下一行

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

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

由于委托需要两个参数,因此失败了。此外,委托需要 object SerialDataReceivedEventArgs ,而不是字符串。

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

例如(在C#3中):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top