c# - System.InvalidOperationException

Allgemeinen

Ich bin versucht, zu schreiben eine sehr einfache TCP /IP client-server in C# eine Verbindung zu einer IP-Adresse mit einer port-Nummer, und Fragen Sie ganz einfach den Kommandozeilen-Modus, und legen Sie dann die Antworten in einer Gridbox -, Grafik-oder andere Anzeige-option.

Habe ich online geschaut und fand die downloadbar-Dienstprogramm, das gerade diese, geschrieben von Jayan Nair, und diese wird zum senden der Nachricht korrekt, und Sie erhalten die Antwort ok.

Das problem kommt, wenn ich versuchen und laden die Antwort-Daten in eine RTF-oder GridView-Steuerelements.

Die Fehlermeldung die ich bekommen hab ist :-
System.InvalidOperationException

Habe ich mich gefragt, Microsoft-Foren, und Sie haben mich sehr kompliziert, nicht eindeutig und übermäßig beteiligt Hinweis darauf, was ich tun sollte, und dazu gehört die so genannte INVOKE und BeginInvoke, und diese ganzen Dinge zu sein scheint, ein Projekt in der it;s eigenen Recht.

Was ich bin nach nur ein Beispiel, das funktioniert, ohne dass es zu kompliziert ist.

Hier der code :-

        try
        {
            SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
            int iRx = theSockId.thisSocket.EndReceive(asyn);
            char[] chars = new char[iRx + 1];
            System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
            //
            System.String szData = new System.String(chars);
            richTextRxMessage.Text =  szData;  //fails
            //textBox1.Text = szData;          //also fails
            WaitForData();
        }

und hier ist die Fehlermeldung :-

base {System.Windows.Forms.TextBoxBase} = {Text = '((System.Windows.Forms.RichTextBox)    (((System.Windows.Forms.RichTextBox)(richTextRxMessage)))).Text' threw an exception of type   'System.InvalidOperationException'}

Zusätzliche Informationen :-
szData enthält über 6300 Zeichen, einschließlich der Laschen (9) und zurück (13), und ist im Einklang mit der Nachricht, gesendet von dem server
Ich habe auch versucht es mit einem Textfeld anstatt RTF, Gleiches Ergebnis

Für Interessierte

Hier ist der Microsoft-link

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/12a67fb0-847e-4e2b-baa8-ef6ceed60aa4/


  • Hier nur 2 der Kodex-änderungen, dass ich versucht habe, scheitern beide auf den gleichen Fehler
  • Ich denke, was ich tun müssen, ist, starten Sie C# auf einem viel niedrigeren Niveau und nicht einfach ins kalte Wasser springen und das beste hoffen


       public void OnDataReceived(IAsyncResult asyn)
        {
    
            int InputRx;
            int charLen;
            char[] Inputchars;
            System.Text.Decoder InputDecode;
            System.String szData;
            bool IfInvokeRequired;
    
            try
    
            {
    
                SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
                InputRx = theSockId.thisSocket.EndReceive(asyn);                    //get size of input array
                Inputchars = new char[InputRx + 1];                                   //put i char array
                InputDecode = System.Text.Encoding.UTF8.GetDecoder();
                charLen = InputDecode.GetChars(theSockId.dataBuffer, 0, InputRx, Inputchars, 0);
                szData = new System.String(Inputchars);
                IfInvokeRequired = richTextRxMessage.InvokeRequired;
                if (IfInvokeRequired == true)
                {
                    richTextRxMessage.Invoke((MethodInvoker)delegate { this.Text = szData; });//fails
                    richTextRxMessage.BeginInvoke(new MethodInvoker(() => richTextRxMessage.Text = szData));//fails as well
                }
    • Ich habe meine Antwort, wurde beeinflusst durch die Microsoft Antwort bereits, aber die große Frage bleibt: Ist dieses auf einem hintergrund-thread. Das ist eine sehr wichtige Frage, die völlig verändern wird meine Antwort.
    • Ich denke, Sie sollten die MSDN Verweis auf die StackOverflow-Antwort ernst. Der Invoke ist eine Zeile zu beheben, nicht um ein Projekt in seinem eigenen Recht. Sie sollten auch in der Lage sein zu sagen, ob Sie sehen, ein cross-thread-Thema, oder nicht. Gibt es da eine Ausnahme?
    InformationsquelleAutor Brin | 2013-03-14
    Schreibe einen Kommentar