Следует ли использовать Stream.CopyToAsyn c () для копирования данных из сетевого потока? - PullRequest
0 голосов
/ 08 мая 2020

Я получаю данные из NetworkStream из TcpClient и хочу записать данные в MemoryStream фиксированной длины, потому что я знаю размер данных.

Я использую Stream.CopyToAsync для записи данных в MemoryStream:

var result = new MemoryStream(size);
await ns.CopyToAsync(result);
result.Position = 0;

return result;

Глядя на исходный код из Stream.CopyToAsync, метод завершается, когда в исходном потоке нет данных . В моем случае, когда сетевое соединение медленное или прервано, мой метод вернет неполное MemoryStream.

Могу ли я игнорировать эту возможность или мне следует читать поток самостоятельно, поскольку я знаю, сколько данных будет отправлено?

1 Ответ

1 голос
/ 08 мая 2020

Поскольку NetworkStream.Read будет блокировать 1 до тех пор, пока не появятся данные, и возвращать 0 только в случае закрытия соединения, я не думаю, что это удовлетворит ваши потребности лучше, чем CopyToAsync.

Поскольку вы уже знаете, сколько данных вы надеетесь получить, я рекомендую просто проверить, что MemoryStream имеет желаемую длину:

var result = new MemoryStream(size);
await ns.CopyToAsync(result);

if (result.Length != size) {
     // it didn't load everything
}

result.Position = 0;

return result;

1 { ссылка }

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