c#gui挂起但仍然可以听和处理

时间:2011-08-23 01:28:02

标签: c# user-interface blocking

为什么我的c#服务器gui挂起?我知道哪里出错了?谢谢

就像它,当我点击button1,gui挂起,但它仍然可以处理请求并监听并接受传入的客户端连接。

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    TcpListener listener = null;
    TcpClient client = null;
    NetworkStream stream = null;
    BinaryWriter writer = null;
    BinaryReader reader = null;
    string vouchercode;
    string username;
    string password;
    string reseller;
    string fresh;
    string result;


    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            listener = new TcpListener(new IPAddress(new byte[] {127,0,0,1}), 6666);
            listener.Start();
            while (true)
            {
                label1.Text = "waiting....";
                using (client = listener.AcceptTcpClient())
                {
                    label1.Text = "Connection request accepted!";
                    using (stream = client.GetStream())
                    {


                        //some codes here ..
                    }
                }
            }
        }


        catch (WebException ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            if (listener != null) listener.Stop();
            if (writer != null) writer.Close();
            if (reader != null) reader.Close();
        }


    }



}

}

3 个答案:

答案 0 :(得分:3)

它挂起,因为AcceptTcpClient()是一种阻止方法。您可以查看并尝试合并BeginAcceptTcpClient(),以使其无阻塞。 msdn页面中有一个例子。

答案 1 :(得分:0)

你也进入了一个while循环而没有我可以看到退出它的逻辑。所以你要挂了。将繁重的事情从事件中解脱出来并在这种情况下变成另一个线程也是一种好习惯。

答案 2 :(得分:0)

当您在UI线程上进行处理时(就像您在按钮单击处理程序中一样),重要的是不要阻止。正如Bala指出的那样,你有一个阻塞调用,它位于一个(可能是无限的)循环中,这是一个问题,因为你永远不会退出该函数,允许处理窗口消息(窗口消息执行重绘窗口等操作,响应按钮点击等UI控件......)。

答案是要使button1_Click无阻塞,要么将套接字代码移到另一个线程。

查看此SO主题:

How to spread tcplistener incoming connections over threads in .NET?