次のコードセグメントに問題があります。パラメータ数が一致しません。
複数のスレッドと安全でない更新に関する問題のため、私はこれを書かなければなりませんでした。
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]
)に渡すパラメーターは1つだけですが、2つのパラメーター(senderとe)があります。
編集:コードを注意深く読んだ後、label_sensorValue
の値を設定するSetSensorValue
メソッドを作成することをお勧めします。現在、間違ったパラメーターでイベントハンドラーを呼び出そうとしています。
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;
}
}
問題は、パラメーターが1つだけの2つのパラメーターのデリゲートを呼び出すことです。
次の行
label_sensorValue.Invoke(del,new object[] {tokens[1]});
パラメータtokens[1]
を使用して、UIスレッドでデリゲートを呼び出します。
デリゲートには2つのパラメーターが必要なので、失敗します。さらに、デリゲートは、文字列ではなくobject
とSerialDataReceivedEventArgs
を期待します。
これを修正するには、デリゲートの代わりに無名メソッドを呼び出す必要があります。
例(C#3の場合):
label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));