【问题标题】:Parameter Count Mismatch参数计数不匹配
【发布时间】:2009-10-28 11:17:31
【问题描述】:

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

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


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

【问题讨论】:

  • 错误(根据 C# 调试器)是由以下行引起的:label_sensorValue.Invoke(del,new object[] {tokens[1]});

标签: c# count parameters mismatch


【解决方案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;
    }
}

【讨论】:

    【解决方案2】:

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

    下面一行

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2017-12-31
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      相关资源
      最近更新 更多