c# - "क्रॉस थ्रेड ऑपरेशन मान्य नहीं है".. सीरियल पोर्ट पर डेटा पढ़ते समय




winforms serial-port (2)

आपका ईवेंट हैंडलर UI थ्रेड पर नहीं चल रहा है यूआई धागे को प्राप्त करने के लिए मुख्य प्रपत्र के आविंग विधि का उपयोग करें।

विंडोज़ फॉर्म में, मुख्य फॉर्म लोड पर, मैंने एक सीरियल पोर्ट सेट किया है और इसे पढ़ना शुरू कर दिया है। इसका उद्देश्य, जैसा कि और जब मुझे सीरियल पोर्ट पर कुछ डेटा प्राप्त होता है, तो मैं डेटा से संबंधित दूसरे फार्म को खोलना चाहता हूं।

इसलिए मैं सीरियल पोर्ट के डेटा रीसिव इवेंट हैंडलर का उपयोग करता हूं।

  void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            string str = this.serialPort1.ReadLine();


                if (!string.IsNullOrEmpty(str))
                {


                    Main.Instance.customerData = new CustomerData(str);
                    Main.Instance.customerData.MdiParent = Main.Instance;  //Exeption received at this point
                    Main.Instance.customerData.Disposed += new EventHandler(customerData_Disposed);

                    Main.Instance.customerData.Show();


                }

        }

लेकिन जब मैं ईवेंट हैंडलर के अंदर एक फार्म खोलने की कोशिश करता हूं तो मुझे एक अमान्यऑपरेशन एसेप्शन कहते हुए कहते हैं: "क्रॉस-थ्रेड ऑपरेशन मान्य नहीं: नियंत्रण 'मेन' ​​थ्रेड से बनाया गया था जिस पर इसे बनाया गया था।"

मैंने कोड लाइन को निकालने की कोशिश की: Main.Instance.customerData.MdiParent = Main.Instance; तो यह ठीक काम करता है लेकिन यह भी आवश्यक है कि यह एक बच्चे के रूप में खोलने के लिए mpiparent को असाइन करें।

इस समस्या को हल करने के लिए कोई सुझाव?


मुख्य रूप पर आविंग विधि का उपयोग करें। आपको इसके साथ इंटरैक्ट करने के लिए मुख्य प्रपत्र पर नियंत्रण रखना होगा। ईवेंट हैंडलर को पृष्ठभूमि थ्रेड पर ट्रिगर किया गया है

यहां कुछ नमूना कोड है जो काम कर सकता है:

void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string str = this.serialPort1.ReadLine();
    if (!string.IsNullOrEmpty(str))
    {
        ShowCustomerData(str);
    }   

}

private delegate void ShowCustomerDataDelegate(string s);

private void ShowCustomerData(string s)
{
    if (Main.Instance.InvokeRequired)
    {
        Main.Instance.Invoke(new ShowCustomerDataDelegate(ShowCustomerData), s);
    }
    else
    {

        Main.Instance.customerData = new CustomerData(str);
        Main.Instance.customerData.MdiParent = Main.Instance;  //Exeption received at this point
        Main.Instance.customerData.Disposed += new EventHandler(customerData_Disposed);

        Main.Instance.customerData.Show();
    }
}






multithreading