在Form2()中启动“新线程IsBackground = true”并陷入while(true)循环

时间:2018-05-17 20:57:13

标签: c# multithreading sockets system.net.sockets

我正在制作多线程聊天服务器和聊天客户端。客户端有一个名为Login的Form1和一个名为MainProgram的Form2。以下代码来自“登录”。我要做的是从Login转换到MainProgram ......

        MainProgram mP = new MainProgram(clientSocket, username);
        mP.Closed += (s, args) => this.Close();
        this.Hide();
        mP.ShowDialog();
        mP.Show();

......但是。分配mP时MainProgram mP = new MainProgram(clientSocket, username);代码被卡在此处指定的线程中:

public MainProgram(TcpClient c, string u)
    {
        InitializeComponent();
        try
        {
            serverStream = c.GetStream();
            clientSocket = c;
            username = u;
            new Thread(Receive()) { IsBackground = true }.Start();
        }

这是主题:

        private ThreadStart Receive()
    {
        while (true)
        {
            try
            {
                byte[] inStream = new byte[1024];
                serverStream.Read(inStream, 0, inStream.Length);
                string returndata = Encoding.ASCII.GetString(inStream);
                returndata = returndata.Substring(0, returndata.IndexOf("$"));
                Msg($"{returndata}");
            }
            catch(Exception e)
            {
                MessageBox.Show($"{e.Message}\n\n{e.ToString()}");
            }
        }
    }

请注意,线程应该在无限期循环时运行,但在后台运行。现在它不会创建一个新线程并在MainThread上运行。问题是我不知道如何在不使客户端陷入此循环的情况下启动此线程。而不是过渡。

1 个答案:

答案 0 :(得分:1)

您似乎并不了解ThreadStart是什么。这是创建线程所接受的方法的签名。

致电时:

new Thread(Receive()) 

您实际上正在呼叫"接收"主线程中的方法,并将其返回值提供给线程构造函数(这种情况从未发生过,因为它卡在了无限循环中。

相反,你需要做

new Thread(new ThreadStart(Receive))

请注意删除的括号。

但是,由于您的Receive方法没有正确的签名,因此您将收到编译错误。所以你需要把它改成:

private void Receive()
{
    // ...
}