【问题标题】:c# gui hangs but still can listen and process时间:2019-05-10 标签:c#gui hangs but still can listen and process
【发布时间】:2011-11-01 14:14:06
【问题描述】:

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

就像,当我单击按钮 1 时,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();
        }


    }



}

}

【问题讨论】:

    标签: c# user-interface blocking


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      答案是要么使button1_Click 非阻塞,要么将套接字代码移动到不同的线程。

      查看这个 SO 线程:

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

      【讨论】:

      • 你能解释一下如何使它成为非阻塞的吗? tnx 两者中哪个更好
      • 上面的链接显示了如何使其成为非阻塞的示例。我会推荐这种方法。
      【解决方案3】:

      您还进入了一个while 循环,我看不到退出它的逻辑。所以你要挂了。将繁重的工作从活动中解脱出来,在这种情况下转移到不同的线程中,这也是一种很好的做法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-02
        • 2013-01-18
        • 2020-06-15
        • 2020-10-01
        • 2015-06-14
        • 2011-07-08
        • 2012-02-03
        • 2017-04-15
        相关资源
        最近更新 更多