Ответы с форумов MSDN

Зависает считывание XML из NetworkStream

Date: 15.01.2018 5:19:30

Интересный вопрос. Дело в том, что NetworkStream отличается от других типов потоков довольно значительно, хотя это не всегда очевидно.

DataTable использует XmlReader для считывания XML из потока. Его конструктор пытается считать из потока определенное количество байт, которое вычисляется методом CalcBufferSize, и зависит от ситуации:

- для потоков с поддержкой изменения позиции (FileStream/MemoryStream) размер буфера вычисляется хитрым алгоритмом

- для остальных (NetworkStream) берется жестко заданное значение DefaultBufferSize = 4096

Для NS нет способа указать конец потока (кроме Socket.Shutdown, но после него сокет не сможет больше слать данные). Поэтому при попытке считать 4КБ, метод Read будет ждать прихода именно этих 4КБ, т.е. на фрагменте <4КБ все повиснет. 

Вывод - при пересылке XML размером <4КБ нужно действительно, либо делать промежуточный поток с меньшим размером буфера, либо после отправки обязательно закрывать сокет. Как-то так.


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub