Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 30
1

Как правильно завершить поток с TcpListener.AcceptTcpClient() ?

02.12.2015, 10:26. Показов 2268. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Меня интересует как лучше сделать остановку потока, в котором принимаем входящие TCP соединения, и используется блокирующий вызов TcpListener.AcceptTcpClient() . Код ниже работает, но мне кажется кривоват.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    // Основной поток 
    TcpListener Listener = new TcpListener(ip, tcpport);
    Listener.Start();
 
    // Cоздем отдельный поток для ожидания входящих TCP соединений
    ListnerThread = new Thread(ListnerLoop);
    ListnerThread.Start();
 
    ...
        
    // Теперь из основного потока нужно корректно остановить 
    // прием входящих TCP соединений и завершить второй поток
 
    // сейчас делаю так:
    Listener.Stop();
    ListnerThread.Join();
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        // Этот метод работает в отдельном потоке, в нем ожидаем соединения
        private void ListnerLoop()
        {
            try
            {
               while (true)
                {
                    // Почти все время висим здесь на блокирующем вызове Listener.AcceptTcpClient(),
                    // ждем соединения
                    using (TcpClient client = Listener.AcceptTcpClient())
                    {
                        ... 
                        // принимаем соединение, передаем данные
                        client.Close();
                    }
                    // переходим к ожиданию нового соединения
                }
            }
            catch (System.Net.Sockets.SocketException) { }
            // При вызове из другого потока Listener.Stop(), возникае исключение WSACancelBlockingCall
            // Ловим это исключение, выходим из цикла и завершаем поток.
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2015, 10:26
Ответы с готовыми решениями:

Как правильно завершить поток сервера?
{ Listener = new TcpListener(Settings.ip, Settings.port); // Создаем "слушателя" для...

Как правильно завершить поток FileStream
Здравствуйте. В процессе работы программы FileStream должен работать постоянно, так как получает...

Как правильно завершить поток без исключения ThreadInterruptedException?
В общем, есть отдельный проект dll-ки с компонентом, наследующим MonthCalendar. В нем дополнительно...

Как правильно завершить поток (программа часы в Label)
Здравствуйте, есть простая многопоточная программа - на форме в Label отображается время (программа...

0
02.12.2015, 10:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2015, 10:26
Помогаю со студенческими работами здесь

Как правильно завершить поток
Всем привет. Что я делаю не так ? Поток запускается и работает хорошо, но вот при завершении...

Как правильно завершить поток QThread и выйти из него?
Здравствуйте, форумчане! Есть GUI-приложение, кнопка в окне приложения запускает цикл обмена...

Как правильно завершить поток, который лочит мьютекс в цикле?
Есть поток, созданный посредствам CreateThread, который в цикле лочит именной мьютекс, ну типа...

Правильно завершить поток
Здравствуйте!!! Делаю программу через поток. Вот код #include <vcl.h> #pragma hdrstop ...

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

Как завершить поток
Как завершить поток, начатый _beginthread( Thread, 0, NULL );


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru