C# 在循环内联系TCP侦听器时应用程序挂起

C# 在循环内联系TCP侦听器时应用程序挂起,c#,winforms,console,tcpclient,tcplistener,C#,Winforms,Console,Tcpclient,Tcplistener,我一直在尝试设置一个客户端应用程序,它使用TCP套接字与控制台服务器应用程序联系 我需要我的客户机不断地向服务器检查“是否有可用的数据?”并且在某个时候服务器将用数据进行响应,这些数据将显示在应用程序屏幕上 服务器应用程序是基于控制台的应用程序,客户端使用winforms,因此用户可以单击GUI中的按钮并启动该过程。当收到数据时,我需要它在屏幕上的文本框中显示 问题是winform应用程序挂起在循环中。它正在工作,但完全禁用,不允许任何按钮点击,也不在屏幕上显示返回的数据 以下是我设置客户端应用

我一直在尝试设置一个客户端应用程序,它使用TCP套接字与控制台服务器应用程序联系

我需要我的客户机不断地向服务器检查“是否有可用的数据?”并且在某个时候服务器将用数据进行响应,这些数据将显示在应用程序屏幕上

服务器应用程序是基于控制台的应用程序,客户端使用winforms,因此用户可以单击GUI中的按钮并启动该过程。当收到数据时,我需要它在屏幕上的文本框中显示

问题是winform应用程序挂起在循环中。它正在工作,但完全禁用,不允许任何按钮点击,也不在屏幕上显示返回的数据

以下是我设置客户端应用程序的方式:

private void button1_Click(object sender, EventArgs e)
{
    TcpClient client = new TcpClient("127.0.0.1", 8888);
    try
    {
        Stream s = client.GetStream();
        StreamReader sr = new StreamReader(s);
        StreamWriter sw = new StreamWriter(s);
        sw.AutoFlush = true;
        Console.WriteLine(sr.ReadLine());
        while (true)
        {
            tbData.Text = "Name: ";
            string name = textBox2.Text;
            sw.WriteLine(name);
            if (name != null)
            {
                tbData.Text = sr.ReadLine();
            }
            Thread.Sleep(5000);
        }
        s.Close();

    }
    finally
    {
        client.Close();
    }
}

我不确定这是否是最好的方法,但它只是每5秒发送一次请求,但我需要该部分在后台运行(前提是这是最好的方法)。

您正在阻止UI线程。找出这意味着什么,并使用任何常用技术来取消阻止它


当您在UI线程上运行代码时,UI在该时间段内无法更新。

UI线程正忙,而不是挂起。在UI等待时,将其推送到后台线程进行处理。您应该查看BackgroundWorker: