YaKotikTvoy
@YaKotikTvoy
Стьюдик

Почему не запускается второй поток по приёму данных?

public VlazhnostForm()
        {
            InitializeComponent();

            server = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[Dns.GetHostAddresses(Dns.GetHostName()).Length - 1], port);

            socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socketServer.Bind(server);

            socketServer.Listen(10);

            VlazhnostTimerTread = new Thread(() =>
            {
                Invoke((Action)(() =>
                {
                    HumidityReception();//System.InvalidOperationException: "Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна."
                }));
            });

            VlazhnostTimerTread.Start();
        }
private void HumidityReception()
        {
            while (true)
            {
                Socket socketWithData = socketServer.Accept();

                if (socketWithData.Available > 0)
                {
                    byte[] buffer = new byte[256];

                    string data;

                    do
                    {
                        byte size = (byte)socketWithData.Receive(buffer);

                        data =  Encoding.UTF8.GetString(buffer, 0, size);

                    } while (socketWithData.Available > 0);
                    AddString(data);


                }
                Thread.Sleep(6000);
            }

        }

Я пытался создать этот поток в Form_load и Shown, но там потом форма не загружалась вообще.
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
@Voland69
Правильно что не загружалась.
Вы же делаете блокирующий while(true).
Конкретно проблема вот тут:
VlazhnostTimerTread = new Thread(() =>
            {
                Invoke((Action)(() =>
                {
                    HumidityReception();//System.InvalidOperationException: "Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна."
                }));
            });


Вы неправильно юзаете Invoke() - он по умолчанию влезает в очередь UI потока чтобы модифицировать данные на форме. А Вы в него весь свой цикл положили.

Нужно скорее так поступить:
VlazhnostTimerTread = new Thread(() => HumidityReception());

private void HumidityReception()
{
//-----
    Invoke((Action)(() => AddString(data));
//-----
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы