2010-02-12 3 views
6

Je continue d'obtenir l'erreur suivante lors du débogage.Opération croisée pas valide

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

Voici le code qu'il pointe vers:

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

quelqu'un peut me aider s'il vous plaît résoudre ce problème?

+0

Ne jamais corriger ce problème en fixant CheckForIllegalCrossThreadCalls false. Il prétend juste qu'il n'y a pas de problème plutôt que de le réparer ... – user2141066

Répondre

21

Vous devez remplacer:

richTextBoxReceivedMsg.AppendText(szData); 

avec quelque chose comme

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

La raison en est que Windows Forms est pas vraiment conçu pour fonctionner sur différents threads. La méthode Invoke exécute le délégué que vous lui passez dans le thread d'interface utilisateur. Si vous souhaitez manipuler des éléments de l'interface utilisateur via d'autres threads, vous devrez exécuter la manipulation réelle sur le thread de l'interface utilisateur. La propriété InvokeRequired vous indiquera quand vous devez utiliser Invoke plutôt que d'appeler la méthode directement.

+1

Merci, Mehrdad. :) - ... Il affiche un message indiquant "Impossible de convertir une méthode anonyme pour taper" System.Delegate "car ce n'est pas un délégué." –

+0

@ j-t-s: Je me trompe toujours et j'oublie que l'argument à invoquer est 'System.Delegate'. Cela devrait le réparer. –

2

Consultez l'article de Jon Skeet sur le multi-threading, en particulier la page multi-threading winforms. Cela devrait vous corriger.

+1

Merci beaucoup, @magnifico. Très intéressant lire! –

0

This lien peut être en mesure de vous aider.

+1

Merci Otavio, en le regardant maintenant :) –

-1

vérifiez en écrivant l'instruction donnée dans votre constructeur form1() RichTextBox.CheckForIllegalCrossThreadCalls = false;

Merci u ....

+0

Cela fonctionne. –

Questions connexes