.NET NetworkStream закрыт, как быть уверенным, что все данные прочитаны? - PullRequest
1 голос
/ 18 июня 2010

У меня открытое TCP-соединение, и я читаю с помощью NetworkStream.BeginRead ().Как только соединение закрывается на любом конце, вызывается обратный вызов, и объект потока становится бесполезным - как в документации сказано, что EndRead () генерирует IOException или ObjectDisposedException в зависимости от того, на каком конце было разорвано соединение.

гарантированно, что нет никаких данных, которые я пропускаю только между последним успешным EndRead (и re-BegingRead) и отключением, особенно если я делаю это в моем конце?Если это не так, если я заканчиваю закрывать соединение, нужно ли вручную отключать NetworkStream.Read (), чтобы убедиться, что ничего не осталось непрочитанным?

1 Ответ

2 голосов
/ 24 июня 2010

Шаблон, который следует использовать в этом случае, состоит в том, чтобы использовать BeginRead для чтения потока (точно так же, как вы это делаете) и обрабатывать случай «больше данных в потоке» в методе обратного вызова.
Метод обратного вызова вызывает EndReadи собирает данные, прочитанные из потока (обычно путем добавления их в экземпляр StringBuilder) , а затем снова вызывает BeginRead .Как только EndRead возвращает 0 байтов, это гарантирует, что больше нет данных для чтения из потока.

Вот документация, которая может оказаться полезной: Использование асинхронных клиентских сокетов

Я заметил, что нигде там не указано, что возвращение 0 байтов является гарантией, поэтому я понимаю ваше замешательство здесь, но пример очень ясен, что это ваш сигнал прекратить чтение.

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