0

嗨,我正在开发一个使用调用和线程的项目。它是一个简单的远程桌面程序,带有聊天功能。我在互联网上用 c# winform 获得了一个示例,但我想将它转换为 wpf 。我没有使用 wpf 程序向另一个客户端发送消息时出现问题,但它无法接收(或无法读取)来自其他客户端的发送消息。我认为这与线程和调用方法有关,我读到 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.BeginInvoke) 。Dispatcher

我还强烈建议您:

  • 将代码重构为更小的方法
  • 停止捕获,Exception除非在任何大型操作的顶层(它应该只是一个后备;通常你会捕获特定的异常)
  • 开始遵循 .NET 命名约定
  • 添加一个using指令,System这样你就可以只写Console.WriteLine而不是System.Console.WriteLine到处写
  • 每次需要时使用Encoding.ASCII而不是创建新的ASCIIEncoding
  • 使用 aStreamReader从流中读取字符数据,而不是先将其作为二进制数据读取,然后再对其进行编码
  • 对于Streamor TextReader,不要忽略 from 的返回值Read- 它告诉您已读取了多少字节或字符
于 2013-05-03T05:46:04.513 回答