Несоответствие количества параметров
-
06-07-2019 - |
Вопрос
Возникли проблемы со следующим сегментом кода. Я получаю несоответствие количества параметров.
Мне пришлось написать это из-за проблем с несколькими потоками и небезопасных обновлений.
<Ч> 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]
.
Поскольку делегату требуются два параметра, он не работает. Кроме того, делегат ожидает объект
и SerialDataReceivedEventArgs
, а не строку.
Чтобы это исправить, вы должны вызвать анонимный метод вместо делегата.
Например (в C # 3):
label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));