0

こんにちは、invoke とスレッドを使用するプロジェクトに取り組んでいます。これは、チャット機能を備えた単純なリモート デスクトップ プログラムです。インターネット上で c# winform のサンプルを入手しましたが、それを wpf に変換したいと思います。 wpfプログラムを使用して別のクライアントにメッセージを送信する際の問題ですが、他のクライアントから送信されたメッセージを受信できません(または読み取ることができません)..スレッドとinvokeメソッドに関係があると思います.wpfの呼び出しが異なることを読みましたそして私はdispatcher.invokeを試しましたが、それでもうまくいきません

よろしくお願いします

ここにコードがあります

wait = new Thread(new ThreadStart(waitForData));
wait.Start();

上記のスニペットは、tcpclient で接続が成功したときに実行されます

    private void waitForData()
    {
        try
        {
            NetworkStream read = tcpclnt.GetStream();
            while (read.CanRead)
            {
                byte[] buffer = new byte[64];

                read.Read(buffer, 0, buffer.Length);
                s = new ASCIIEncoding().GetString(buffer);
                System.Console.WriteLine("Recieved data:" + new ASCIIEncoding().GetString(buffer));
                rcvMsg = new ASCIIEncoding().GetString(buffer) + "\n";
                hasNewData = true;


                bool f = false;
                f = rcvMsg.Contains("##");
                bool comand = false;
                comand = rcvMsg.Contains("*+*-");

                   /*File receive*/

                 if (f)
                {
                    string d = "##";
                    rcvMsg = rcvMsg.TrimStart(d.ToCharArray());
                    int lastLt = rcvMsg.LastIndexOf("|");
                    rcvMsg = rcvMsg.Substring(0, lastLt);
                    NetworkStream ns = tcpclnt.GetStream();
                    if (ns.CanWrite)
                    {
                        string dataS = "^^Y";
                        byte[] bf = new ASCIIEncoding().GetBytes(dataS);
                        ns.Write(bf, 0, bf.Length);
                        ns.Flush();
                    }
                    try
                    {
                        new Recieve_File().recieve_file(rcvMsg);
                    }
                    catch (Exception ec)
                    {
                        System.Console.WriteLine(ec.Message);
                    }

                }
                     /*Command-shutdown/restart/logoff*/
                else if (comand)
                {
                    string com = "*+*-";
                    rcvMsg = rcvMsg.TrimStart(com.ToCharArray());
                    execute_command(rcvMsg);

                }
                else
                {
                    this.Invoke(new setOutput(setOut));
                    Thread.Sleep(1000);
                }


            }
        }
        catch (Exception ex)
        {
            wait.Abort();
            output.Text += "Error..... " + ex.StackTrace; 
        }

    }

上記のスニペットは、メッセージまたはコマンドがあるかどうかをリッスンするコードです。行 this.invoke(new setoutput(setout)) は、rtb にテキストを追加するためのコードです

誰かが私を助けてくれることを願っています

4

1 に答える 1

1

多くのコードを投稿しましたControl.Invokeが、問題を引き起こしているのは呼び出しだけだと思います。WPF では、関連する UI 要素のプロパティを介して代わりにDispatcher.Invoke(または) を使用します。Dispatcher.BeginInvokeDispatcher

また、次のことを強くお勧めします。

  • コードをより小さなメソッドにリファクタリングする
  • Exception大規模な操作のトップ レベル以外でのキャッチを停止します (これは単にフォールバックである必要があります。通常、特定の例外をキャッチします) 。
  • .NET 命名規則に従い始める
  • usingディレクティブを追加して、どこにでも書く代わりにSystem書くことができるようにしますConsole.WriteLineSystem.Console.WriteLine
  • 必要なたびEncoding.ASCIIに新しいものを作成する代わりに使用しますASCIIEncoding
  • StreamReader最初にバイナリ データとして読み取ってからエンコードするのではなく、ストリームから文字データを読み取るには、 a を使用します。
  • またはからの戻り値を無視しないでください。読み取ったバイト数Streamまたは文字数がわかります。TextReaderRead
于 2013-05-03T05:46:04.513 に答える