/// <summary>
        /// Слушает входящие сообщения пока "живо" соединение.
        /// </summary>
        private void ReceiveMessages()
        {
            alive = true;
            try
            {
                while (alive)
                {
                    byte[]        data    = new byte[64];
                    StringBuilder builder = new StringBuilder();
                    int           bytes   = 0;
                    do
                    {
                        bytes = stream.Read(data, 0, data.Length);
                        builder.Append(Encoding.Unicode.GetString(data, 0, data.Length));
                    } while (stream.DataAvailable);

                    string message = builder.ToString();

                    // добавляем полученное сообщение в текстовое поле
                    context.Post(delegate(object state)
                    {
                        MainChatTextBox.AppendText(message + Environment.NewLine);
                    }, null);
                }
            }
            catch (Exception ex)
            {
                if (!alive)
                {
                    return;
                }
                MessageBox.Show(ex.Message);
                Disconnect();
            }
        }
 private void SendMessageBtn_Click(object sender, RoutedEventArgs e)
 {
     try
     {
         string message = String.Format(MessageTextBox.Text);
         byte[] data    = Encoding.Unicode.GetBytes(message);
         stream.Write(data, 0, data.Length);
         MessageTextBox.Clear();
         MainChatTextBox.AppendText(Environment.NewLine + "Вы: " + message);
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
        /// <summary>
        /// Разрывает соединение с сервером (выход из чата)
        /// </summary>
        private void Disconnect()
        {
            alive = false;

            // уведомляем сервер о разрыве соединения
            byte[] data = Encoding.Unicode.GetBytes("ext0");
            stream.Write(data, 0, data.Length);

            if (stream != null && stream.CanWrite)
            {
                stream.Close();
            }
            if (client != null)
            {
                client.Close();
            }

            MainChatTextBox.AppendText(Environment.NewLine + "Вы вышли из чата.");

            ChangeViewElementsAccessibility(false);
        }
        /// <summary>
        /// Заходит в чат с ником, указанным в NickTextBox или с уникальным ником типа "Guest...".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EnterChatBtn_Click(object sender, RoutedEventArgs e)
        {
            if (!String.IsNullOrEmpty(NickTextBox.Text))
            {
                userName = NickTextBox.Text;
            }
            else
            {
                userName = "******" + Guid.NewGuid().ToString();
            }

            try
            {
                client = new TcpClient();
                client.Connect(HOST, PORT);
                stream = client.GetStream();

                byte[] data = Encoding.Unicode.GetBytes(userName);
                stream.Write(data, 0, data.Length);

                // запускаем задачу на прием сообщений (предпочтительно)
                Task receiveTask = new Task(ReceiveMessages);
                receiveTask.Start();

                // так тоже работает...вроде XD
                //Thread receiveTask = new Thread(new ThreadStart(ReceiveMessages));
                //receiveTask.Start();

                MainChatTextBox.AppendText(Environment.NewLine + "Добро пожаловать " + userName);

                ChangeViewElementsAccessibility(true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                Disconnect();
            }
        }