Запуск «нового потока IsBackground = true» в Form2 () и застрять в цикле while (true) - PullRequest
0 голосов
/ 17 мая 2018

Я делаю многопоточный чат-сервер и чат-клиент.У клиента есть Form1 с именем Login и Form2 с именем MainProgram.Следующий код от "Логин".То, что я пытаюсь сделать, это перейти от входа в MainProgram ...

        MainProgram mP = new MainProgram(clientSocket, username);
        mP.Closed += (s, args) => this.Close();
        this.Hide();
        mP.ShowDialog();
        mP.Show();

... однако.При назначении mP MainProgram mP = new MainProgram(clientSocket, username); Код get застрял в указанном здесь потоке:

public MainProgram(TcpClient c, string u)
    {
        InitializeComponent();
        try
        {
            serverStream = c.GetStream();
            clientSocket = c;
            username = u;
            new Thread(Receive()) { IsBackground = true }.Start();
        }

Вот поток:

        private ThreadStart Receive()
    {
        while (true)
        {
            try
            {
                byte[] inStream = new byte[1024];
                serverStream.Read(inStream, 0, inStream.Length);
                string returndata = Encoding.ASCII.GetString(inStream);
                returndata = returndata.Substring(0, returndata.IndexOf("$"));
                Msg($"{returndata}");
            }
            catch(Exception e)
            {
                MessageBox.Show($"{e.Message}\n\n{e.ToString()}");
            }
        }
    }

Обратите внимание, что поток должен запускать этотцикл пока бесконечно, но на заднем плане.Прямо сейчас он не создает новый поток и работает на MainThread.Проблема в том, что я не знаю, как запустить этот поток, не заставляя клиента застрять в цикле while.И не переходя.

1 Ответ

0 голосов
/ 18 мая 2018

Кажется, вы не поняли, что такое ThreadStart.Это сигнатура метода, который принят для создания потока.

Когда вы вызываете:

new Thread(Receive()) 

Вы фактически вызываете метод "Receive" в главном потоке, ипередавая возвращаемое значение конструктору потока (что никогда не происходит, потому что он застрял в вашем бесконечном цикле.

Вместо этого вам нужно выполнить

new Thread(new ThreadStart(Receive))

Удалять удаленные скобки.

Но тогда вы получите ошибку компиляции, потому что ваш метод Receive не имеет правильной подписи. Поэтому вам нужно изменить ее на:

private void Receive()
{
    // ...
}
...