C # GUI зависает, но все еще может слушать и обрабатывать - PullRequest
0 голосов
/ 23 августа 2011

почему мой сервер c # зависает?Есть идеи, где я ошибся?спасибо

похоже, в тот момент, когда я нажимаю кнопку1, графический интерфейс зависает, но он все еще может обрабатывать запросы и прослушивать и принимать входящие клиентские соединения.

    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 ]

3 голосов
/ 23 августа 2011

Зависает, потому что AcceptTcpClient() - это метод блокировки. Вы можете посмотреть и попробовать включить BeginAcceptTcpClient(), чтобы он был неблокирующим. На странице msdn есть пример.

0 голосов
/ 23 августа 2011

Когда вы выполняете обработку в потоке пользовательского интерфейса (как, например, в обработчике нажатий кнопок), важно не блокировать.Как указал Бала, у вас есть блокирующий вызов, который находится в (возможно бесконечном) цикле, и это проблема, потому что вы никогда не возвращаетесь из функции, позволяя обрабатывать оконные сообщения (оконные сообщения делают такие вещи, как перекрашивание оконреагировать на элементы управления пользовательского интерфейса, такие как нажатия кнопок и т. д.).

Ответ заключается в том, чтобы либо сделать button1_Click неблокирующим, либо переместить код сокетов в другой поток.из этого потока SO:

Как распространить входящие соединения tcplistener по потокам в .NET?

0 голосов
/ 23 августа 2011

Вы также входите в цикл while без логики, которую я вижу, чтобы выйти из нее. Итак, вы собираетесь повесить. Это также всегда хорошая практика, чтобы вытащить тяжелую работу из ваших событий и в этом случае в другую ветку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...