2010-02-12 14 views
6

डीबगिंग करते समय मुझे निम्न त्रुटि मिलती है।क्रॉस-थ्रेड ऑपरेशन मान्य नहीं है

public void OnDataReceived(IAsyncResult asyn) 
{ 
    try 
{ 
    SocketPacket socketData = (SocketPacket)asyn.AsyncState; 

    int iRx = 0; 

     // Complete the BeginReceive() asynchronous call by EndReceive() method 
     // which will return the number of characters written to the stream by the client 
     iRx = socketData.m_currentSocket.EndReceive (asyn); 

     char[] chars = new char[iRx + 1]; 
     System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); 
     int charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0); 
     System.String szData = new System.String(chars); 
     richTextBoxReceivedMsg.AppendText(szData); 

     // Continue the waiting for data on the Socket 
     WaitForData(socketData.m_currentSocket); 
    } 
    catch (ObjectDisposedException) 
    { 
     System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n"); 
    } 
    catch (SocketException se) 
    { 
     MessageBox.Show(se.Message); 
    } 
} 

किसी कृपया मुझे इसे ठीक मदद कर सकते हैं:

Cross-thread operation not valid: Control 'richTextBoxReceivedMsg' accessed from a thread other than the thread it was created on. 

यहाँ कोड है कि यह की ओर इशारा करता है? कारण यह है कि Windows Forms वास्तव में अलग धागे में काम करने के लिए डिज़ाइन नहीं किया गया है की तरह

Invoke(new Action(() => richTextBoxReceivedMsg.AppendText(szData))); 

कुछ के साथ

richTextBoxReceivedMsg.AppendText(szData); 

:

+0

करो कभी गलत पर CheckForIllegalCrossThreadCalls निर्धारित करके इसे ठीक नहीं। यह सिर्फ नाटक करता है कि वास्तव में इसे ठीक करने के बजाय कोई समस्या नहीं है ... – user2141066

उत्तर

21

आप इस को बदलने के लिए की जरूरत है। Invoke विधि यूआई थ्रेड में आपके द्वारा पास किए गए प्रतिनिधि को चलाएगी। यदि आप अन्य थ्रेड के माध्यम से यूआई तत्वों में हेरफेर करना चाहते हैं, तो आपको यूआई थ्रेड पर वास्तविक हेरफेर चलाना होगा। InvokeRequired संपत्ति आपको बताएगी कि आपको विधि को सीधे कॉल करने के बजाय Invoke का उपयोग करने की आवश्यकता है।

+1

धन्यवाद, मेहदद। :) - ... यह एक संदेश दिखाता है "अज्ञात विधि को 'System.Delegate' टाइप करने के लिए कन्वर्ट नहीं कर सकता क्योंकि यह एक प्रतिनिधि नहीं है।" –

+0

@ जे-टी-एस: मुझे हमेशा यह गलत लगता है और 'सिस्टम' डिलीगेट 'करने का तर्क भूल जाता है। इसे ठीक करना चाहिए। –

2

बहु-थ्रेडिंग पर विशेष रूप से पृष्ठ multi-threading winforms पर जॉन स्कीट का आलेख देखें। यह आपको ठीक से ठीक करना चाहिए।

+1

आपको बहुत धन्यवाद, @ magnifico। बहुत दिलचस्प पढ़ा! –

0

This लिंक आपकी मदद करने में सक्षम हो सकता है।

+1

धन्यवाद ओटावियो, अब इसे देख रहा है :) –

-1

अपने फॉर्म 1() कन्स्ट्रक्टर RichTextBox में दिए गए कथन को लिखकर जांचें। चेकफॉर इलगैलल क्रॉस थ्रेडकॉल = झूठी;

यू धन्यवाद ....

+0

यह काम कर रहा है। –

संबंधित मुद्दे