web-dev-qa-db-ja.com

パラメータ数の不一致

次のコードセグメントに問題があります。パラメータ数が一致しません。

複数のスレッドと安全でない更新に関する問題のため、私はこれを書かなければなりませんでした。


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

エラーはこの行に由来すると思います:

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

問題は、パラメーターが1つだけの2つのパラメーターのデリゲートを呼び出すことです。

次の行

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

パラメータtokens[1]を使用して、UIスレッドでデリゲートを呼び出します。

デリゲートには2つのパラメーターが必要なので、失敗します。さらに、デリゲートは、文字列ではなくobjectSerialDataReceivedEventArgsを期待します。

これを修正するには、デリゲートの代わりに無名メソッドを呼び出す必要があります。

例(C#3の場合):

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