c # NetworkStream write () и read () - PullRequest
       12

c # NetworkStream write () и read ()

5 голосов
/ 27 июля 2011

Мне интересно, как остановить Networkstream.Read() от блокировки потока. У меня есть отдельный поток, где NetworkStream.Read() ждет данных с сервера. Предположим, что пользователь нажал какую-то кнопку, которая отправляет некоторые данные на сервер. Но я не могу позвонить NetworkStream.Write(), пока есть NetworkStream.Read() в другом потоке, ожидающем данных. Я могу заблокировать NetworkStream каждый раз, но NetworkStream.Read() заблокирует поток, поэтому я не могу отправлять данные, пока не будет прочитан хотя бы 1 байт.

Ответы [ 4 ]

7 голосов
/ 27 июля 2011

Вы можете выдать read и write одновременно, как указано в документах по Документы MSDN

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

2 голосов
/ 11 ноября 2011

Вы можете запросить свойство NetworkStream.DataAvailable через некоторые периоды времени и только для чтения, если оно истинно. «Если DataAvailable имеет значение true, вызов Read немедленно возвращается». Таким образом, вы не будете блокировать поток.

2 голосов
/ 27 июля 2011

Вам нужно будет использовать неблокирующую операцию чтения, как описано в: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.beginread.aspx

0 голосов
/ 27 июля 2011

Класс NetworkStream предоставляет методы для отправки и получения данных через сокеты Stream в режиме блокировки.Для получения дополнительной информации о блокирующих и неблокирующих сокетах см. Использование асинхронного клиентского сокета

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...