VYBGSS
@VYBGSS
Software Developer

Как организовать завершение отдельно запущенного треда в C#, если в нем сокет слушает сеть?

В отдельном треде идет ожидание сообщения из сети. Все работает нормально, но, при выходе из программы, тред остается в памяти.

// ...
while (Listening) {
	Socket ChatSocketHandler = ChatSocketListener.Accept();
// ...



Listening, конечно же, изменяется на false для окончания обработки, но ведь к нему дойдет только при следующем сообщении из сети. А мне надо как-то прервать ChatSocketListener.Accept().
  • Вопрос задан
  • 4059 просмотров
Решения вопроса 1
v_decadence
@v_decadence
Попробуйте у этого потока задать свойство IsBackground = true, чтобы он стал фоновым и не предотвращал завершение процесса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
unconnected
@unconnected
AcceptAsync?
Ответ написан
Комментировать
lexdevel
@lexdevel
Разработчик
Либо, действительно, асинхронно сделать через BeginAccept (http://msdn.microsoft.com/ru-ru/library/system.net.sockets.socket.beginaccept(v=vs.110).aspx), либо, как вариант, создать клиентский сокет, и по действию, которое Вам нужно (выход, как я понял), сделать соединение и завершить его…
Ответ написан
Комментировать
Illivion
@Illivion
В принципе, все уже изложили выше, резюмирую:

Вариантов как таковых два:

1. Использовать APM и метод BeginAccept. Оптимальный выбор. Так же можно обернуть в TAP через wrapper и использовать с await.

2. Вынести ссылку на сокет в глобальное пространство и оставить синхронный метод в потоке. Но при выходе закрывать или освобождать сокет из другого потока, а этому потоку назначить IsBackground (подробнее тут) чтобы даже при некорректном выходе поток не завис.
Ответ написан
kosmos89
@kosmos89
Thread.Interrupt()?
Ответ написан
Комментировать
VYBGSS
@VYBGSS Автор вопроса
Software Developer
Благодарю всем. Использовал совет v_decadence (IsBackground = true), поскольку никаких обработок при завершении потока не требуется:

Thread ListeningThread = new Thread(ListeningProcess);
ListeningThread.IsBackground = true;
ListeningThread.Start();
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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