Как вызвать NetworkStream.Read () без блокировки? - PullRequest
3 голосов
/ 17 июня 2009

Я хотел бы очистить буфер чтения сокета, поэтому я написал следующий код ...

byte[] tempBuffer = new byte[1024];
int readCount = 0;
while ((readCount = tcpSocket.GetStream().Read(tempBuffer, 0, tempBuffer.Length)) != 0)
{
    // do with tempBuffer
}

Но метод Read () заблокирован, поэтому я добавил tcpSocket.ReceiveTimeout = 1; . И работает так же, как и раньше.

Как я знаю, это обычно используется в C ++. Как я могу решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 17 июня 2009

Вы можете использовать свойство DataAvailable , чтобы узнать, нужно ли что-нибудь прочитать перед вызовом метода Read.

2 голосов
/ 17 июня 2009

Используйте функцию NetworkStream.Read() напрямую, вместо использования GetStream():

Если нет данных для чтения, метод Read возвращает 0. Read операция читает столько данных, сколько есть доступно, до количества байтов определяется параметром размера. Если удаленный хост выключает соединение, и все доступные данные имеют был получен, метод чтения завершается немедленно и возвращает ноль байт. NoteNote:

1 голос
/ 17 июня 2009

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

Похоже, что вы решили проблему неправильно.

...