2010-08-24 5 views
4

окна службы имеет открытый сокет, который получает данные (в отдельном потоке)Как закрыть блокированный сокет

В ответ на услугу OnShutdown Я хотел бы, чтобы сигнализировать рабочий поток для завершения работы, но в настоящее время заблокировано на Receive.

В настоящий момент я нахожусь на Receive, чтобы проверить, не ожидается ли запрос остановки. Есть ли лучший подход, а не ждать таймаута, чтобы уведомить рабочий поток, чтобы прекратить прием и пройти его логику отключения?

+1

Лучшим подходом является использование асинхронных сокетов. В любом случае, они значительно улучшаются. –

+0

В некотором смысле это асинхронный. Конечно, я не использую BeginReceive - но даже если бы я был, как бы я получил этот поток, чтобы остановить прием, пока он ждет данных. –

ответ

0

Вызов прерываний() на нити должны сделать перерыв из любой блокирующей операции: http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt.aspx

Обратите внимание, что это вызовет ThreadInterruptedException (при блокировке), которые вы должны обращаться соответствующим образом.

+0

было бы здорово, но кажется, что поток не заблокирован Socket.Receive таким образом, что это прерывание когда-либо слышится. –

2

Звоните Socket.Close. Это вызовет метод Socket.Receive, чтобы исключить его разблокирование немедленно.

Исключение - это IO.IOException, которое имеет исключение SocketException как внутреннее исключение. Собственный код ошибки внутреннего исключения составляет 10004.

Смежные вопросы