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

Posted

技术标签:

【中文标题】在 Form2() 中启动“新线程 IsBackground = true”并陷入 while(true) 循环【英文标题】:Starting a "new thread IsBackground = true "in Form2() and getting stuck in while(true) loop 【发布时间】:2018-10-28 05:59:42 【问题描述】:

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

        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\ne.ToString()");
            
        
    

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

【问题讨论】:

您的MainProgram 函数不应调用Receive 那我该如何启动线程呢? 你怎么知道你的程序卡在这个线程里了? 通过调试。我在循环中放置了一个断点并通过步进进行调试。好像我只有一个线程。在调试时顶部的下拉菜单中我只有MainThread 为什么你的Recieve方法被定义为返回一个ThreadStart类型的值? 【参考方案1】:

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

当你打电话时:

new Thread(Receive()) 

您实际上是在主线程中调用“Receive”方法,并将其返回值提供给线程构造函数(这永远不会发生,因为它卡在您的无限循环中。

相反,您需要这样做

new Thread(new ThreadStart(Receive))

注意删除的括号。

但是你会得到一个编译错误,因为你的 Receive 方法没有正确的签名。所以你需要把它改成:

private void Receive()

    // ...

【讨论】:

为了避免混淆,我没有在答案中提到它,但注意new Thread(new ThreadStart(Receive))可以缩短为new Thread(Receive)new ThreadStart是编译器自动添加的) 主要问题,据一位同学说,我在函数后使用了 (),这意味着我正在等待返回值。现在我正在使用“new Thread(ReceiveThread).Start();”,它工作正常:)

以上是关于在 Form2() 中启动“新线程 IsBackground = true”并陷入 while(true) 循环的主要内容,如果未能解决你的问题,请参考以下文章

如何更新form2中的数据而不创建form2的新实例

c#如何实现关闭当前窗体并打开另一个已经创建的窗体。

C#如何在form1中显示Form2中的变量?

java中如何启动一个新的线程

vs2008中,窗体应用程序怎么设置启动窗体?

在新线程中启动方法