Несоответствие количества параметров - PullRequest
16 голосов
/ 28 октября 2009

Возникли проблемы со следующим сегментом кода. Я получаю несоответствие количества параметров.

Мне пришлось написать это из-за проблем с несколькими потоками и небезопасных обновлений.


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

Ответы [ 2 ]

17 голосов
/ 28 октября 2009

Я предполагаю, что ошибка исходит из этой строки:

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

Вы передаете только один параметр в del (tokens[1]), но он имеет два параметра (отправитель и 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;
    }
}
4 голосов
/ 28 октября 2009

Ваша проблема в том, что вы вызываете двухпараметрический делегат только с одним параметром.

Следующая строка

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

вызывает делегата в потоке пользовательского интерфейса с параметром tokens[1].

Поскольку делегату требуются два параметра, он не работает. Кроме того, делегат ожидает object и SerialDataReceivedEventArgs, а не строку.

Чтобы исправить это, вы должны вызвать анонимный метод вместо делегата.

Например (в C # 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
...