Domanda

Problemi con il seguente segmento di codice. Ricevo una mancata corrispondenza del conteggio dei parametri.

Ho dovuto scrivere questo a causa di problemi con più thread e aggiornamenti non sicuri.


       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];
            }
        }
    }
È stato utile?

Soluzione

Suppongo che l'errore provenga da questa riga:

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

Passa solo un parametro a del ( token [1] ) ma ha due parametri (mittente ed e)

MODIFICA: dopo aver letto attentamente il codice, ti suggerisco di creare un metodo SetSensorValue per impostare il valore di label_sensorValue . In questo momento stai cercando di invocare il gestore eventi con parametri errati.

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

Altri suggerimenti

Il tuo problema è che stai chiamando un delegato a due parametri con un solo parametro.

La seguente riga

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

richiama il delegato sul thread dell'interfaccia utente con il parametro tokens [1] .

Poiché il delegato richiede due parametri, sta fallendo. Inoltre, il delegato si aspetta un oggetto e un SerialDataReceivedEventArgs , non una stringa.

Per risolvere questo problema, dovresti invocare un metodo anonimo invece del delegato.

Ad esempio (in C # 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top