Frage

Probleme mit dem folgende Codesegment zu haben. Ich bin ein Parameteranzahl Mismatch zu bekommen.

Ich hatte dies mit mehreren Threads und unsicherem Updates aufgrund von Problemen zu schreiben.


       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];
            }
        }
    }
War es hilfreich?

Lösung

Ich denke, der Fehler kommt aus dieser Zeile:

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

Sie passieren nur einen Parameter zu del (tokens[1]), aber es hat zwei Parameter (Sender und e)

EDIT: nach Ihrem Code sorgfältig zu lesen, schlage ich vor, dass Sie eine SetSensorValue Methode erstellen Sie den Wert von label_sensorValue einzustellen. Gerade jetzt Sie versuchen, die Event-Handler mit falschen Parametern aufgerufen werden kann.

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

Andere Tipps

Ihr Problem ist, dass man mit nur einem Parameter, der ein Zwei-Parameter-Delegierten ist aufgerufen wird.

Die folgende Zeile

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

ruft die Delegierten auf dem UI-Thread mit dem Parameter tokens[1].

Da die Delegierten zwei Parameter erfordert, wird es scheitern. Darüber hinaus erwartet die Delegierten eine object und SerialDataReceivedEventArgs, kein String.

Um dies zu beheben, sollten Sie eine anonyme Methode anstelle des Delegaten aufrufen.

Zum Beispiel (in C # 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top