سؤال

وتواجه مشكلة مع هذا الجزء التالي من التعليمات البرمجية. انني اتلقى عدم تطابق عدد المعلمة.

ولقد كان لكتابة هذا بسبب مشاكل مع مواضيع متعددة والتحديثات غير آمنة.


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

ويمكنك تمرير معلمة واحدة فقط لديل (tokens[1]) لكنه لا يملك معلمتين (المرسل وه)

وتحرير: بعد قراءة بعناية التعليمات البرمجية الخاصة بك، وأنا أقترح عليك أن إنشاء أسلوب 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]});

واستدعاء مندوب على موضوع UI مع tokens[1] المعلمة.

ولما كان المندوب يتطلب معلمتين، انها فاشلة. بالإضافة إلى ذلك، يتوقع مندوب لobject وSerialDataReceivedEventArgs، وليس سلسلة.

ولحل هذه المشكلة، يجب استدعاء الأسلوب مجهول بدلا من مندوب.

وعلى سبيل المثال (في C # 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top