2010-02-12 1 views
6

Continuo a ricevere il seguente errore durante il debug.Operazione cross-thread non valida

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

Ecco il codice che punti a:

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

Può qualcuno si prega di aiutarmi a risolvere questo problema?

+0

Non bisogna mai risolvere questo problema impostando CheckForIllegalCrossThreadCalls su false. Finge solo che non ci siano problemi invece di risolverlo ... – user2141066

risposta

21

è necessario sostituire questo:

richTextBoxReceivedMsg.AppendText(szData); 

con qualcosa di simile

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

Il motivo è che Windows Form non è realmente progettato per funzionare su diversi thread. Il metodo Invoke eseguirà il delegato che gli verrà passato nel thread dell'interfaccia utente. Se vuoi manipolare gli elementi dell'interfaccia utente tramite altri thread, dovrai eseguire la vera manipolazione sul thread dell'interfaccia utente. La proprietà InvokeRequired ti dirà quando è necessario utilizzare Invoke anziché chiamare direttamente il metodo.

+1

Grazie, Mehrdad. :) - ... Viene visualizzato un messaggio che dice "Impossibile convalidare il metodo anonimo per digitare" System.Delegate "perché non è un delegato." –

+0

@ j-t-s: ho sempre sbagliato e dimentico che l'argomento da richiamare è 'System.Delegate'. Questo dovrebbe risolverlo. –

2

Controlla l'articolo di Jon Skeet su multi-threading, in particolare la pagina su multi-threading winforms. Dovresti sistemarti.

+1

Grazie mille, @magnifico. Lettura molto interessante! –

0

This collegamento potrebbe essere in grado di aiutarti.

+1

Grazie Otavio, guardandolo ora :) –

-1

controllare scrivendo l'istruzione data nel modulo1() costruttore RichTextBox.CheckForIllegalCrossThreadCalls = false;

Thank u ....

+0

Questo sta funzionando. –