参数计数不匹配

21

以下代码段存在问题,我遇到了参数数量不匹配的错误。

由于存在多个线程和不安全的更新,我必须编写这段代码。


       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]}); - BSchlinker
3个回答

19

我猜错误出现在这行代码:

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

6
您的问题是您正在使用一个有两个参数的委托,但只传递了一个参数。
以下行代码:
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]));

0
你的 del 可能是这样的。
void del(object[] _Objects)
{
  // type cast _Objects to string[]
{

将其更改为以下内容。

void del(string[] tokens)
{
  // ...
}

在最新的C#中,您不需要使用显式委托和object[]。只需按照以下方式使用方法名称和参数即可。

label_sensorValue.Invoke(LabelPrintMethod, tokens[1]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接