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