2017-04-07 23 views
-3

これはエラーです:スローC#TCPクライアントがメッセージを送信しますが、サーバーがメッセージを受信して​​いません

**

例外: のSystem.Windows.Formsの 'System.InvalidOperationExceptionが'。 dll追加情報:クロススレッド 操作が無効です:作成されたスレッド以外のスレッド からアクセスされたコントロール 'displayText'。

**

Iは、C#で使用してマルチスレッドクライアントとサーバーアプリケーションを作成しました。私はこのエラーについて調査されましたが、関連する回答は見つかりませんでした。私はこれが2つ以上のスレッドがプログラム上で始まったときに来ると知っています...しかし、私のサーバー側にはスレッドが1つあります...なぜこれが来るのか分かりません..........

ここに私のサーバー側は、次のとおりです。

 private void Handler() 
     { 
      try { 


       byte[] b = new byte[100]; 
       int k = s.Read(b, 0, b.Length); 

       //int k = s.Receive(b); 



       string szReceived = Encoding.ASCII.GetString(b,0,k); 
       //If the data to be converted is available only in sequential blocks (such as data read from a stream) or if the amount of data is so large that it needs to be divided into smaller blocks, 


       while (ServerRunning) 
       { 
        string ConcatString = ""; 
        for (int i = 0; i < k; i++) 
        { 

         char n = Convert.ToChar(b[i]); 
         string chars = Convert.ToString(n); 
         ConcatString = ConcatString + chars; 

        } 

        if (b[0] == '$') 
        { 
         displayText.AppendText("\nPrivate Message"); 
         //MessageBox.Show("\nPrivate Message" + Environment.NewLine); 
        } 
        else 
        { 
         displayText.AppendText("\n" + ConcatString); 
         //MessageBox.Show(ConcatString + Environment.NewLine); 
        } 

        //Encoding is the process of transforming a set of Unicode characters into a sequence of bytes and using new instance 
        ASCIIEncoding asen = new ASCIIEncoding(); 

        //s.Send(asen.GetBytes("The string was recieved by the server." + Environment.NewLine)); 

        displayText.AppendText("\n" + ConcatString); 
        /* clean up */ 
        //* 
        // k = s.Receive(b); 
        s.Close(); 
        client.Close(); 
        //MessageBox.Show("Recieved..." + Environment.NewLine); 


       } 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show("Error ...." + ex); 
      } 
     } 

私はソケットプログラミングに新しいですが、私は、一人ひとりのコードセグメントを調査し、数回にコードを実験した。..それでも私はこの中で逃した正確に何を把握することはできませんプログラム...

私はこれを解決するために手伝ってください...私は非常に高く評価されます...

+1

あなたができない別のスレッドからUIを更新しようとしたためにエラーが発生しました。このメッセージのタイトルと本文は一致しませんでした – BugFinder

+0

あなたのサーバーはメッセージを受信して​​います他のスレッドから 'displayText'コントロールにアクセスしようとしています。これはできません。 –

+0

@reneが言い、実際のエラーを理解しようとすると、ソケットについて何も言及していないことに気づくでしょう。 –

答えて

1
Invoke((MethodInvoker) delegate { displayText.AppendText("\n" + ConcatString); }); 

これを修正する必要があります。 「UIに追加」コードをUIスレッドに送出し、UIスレッドが完了するのを待ちます。

+0

@PiyasenaSenani 'Invoke'は' Form 'です。 Invoke'メソッド、[ここ](https://msdn.microsoft.com/en-us/library/system.windows.forms.form.invoke(v = vs.110).aspx); 'MethodInvoker'は、' Delegate.DynamicInvoke'を使うのではなく)パフォーマンスのために 'Invoke'によって特別に扱われる、よく知られたデリゲート型です。基本的には、実行可能なコードフラグメントを作成して、「おい、UI:待っている間実行してください」と –

+2

@PiyasenaSenaniをもう一度、これは**ソケット**とは関係ありません。 UI以外のスレッドからUIに触れている –

+0

@PiyasenaSenaniはもちろんスレッディングです - 例外はあなたに言ったことです。ここであなたのコードを見てください: 'Thread tcpHandlerThread = new Thread(Handler); tcpHandlerThread.Start(); ' - 別のスレッドでハンドラーメソッド***を実行する***。そのスレッドはUIに直接触れることはできません。 –

関連する問題