Использование System.IO.Pipelines вместе с Stream - PullRequest
0 голосов
/ 16 декабря 2018

Я рассматриваю замену потокового ввода-вывода в нашем приложении на System.IO.Pipelines, чтобы избежать ненужного выделения памяти (сначала рассматривался RecyclableMemoryStream, но, похоже, он больше не поддерживается).Но в некоторых местах мне все еще приходится использовать Stream из-за интерфейса, навязанного внешней библиотекой.Поэтому моему PipeWriter нужно будет обернуть свои данные в поток.

Я не нашел много на эту тему, но нашел предложение использовать шаблон декоратора ( C # Stream Pipe (Stream Spy) ) в ответе на другой вопрос.Я не уверен, что было бы правильным скрывать конвейеры за оболочкой потока, но не могу найти ничего другого, что позволило бы мне передавать данные в поток.Я что-то упустил?

ОБНОВЛЕНИЕ.Вот пример использования библиотеки с открытым исходным кодом SSH.NET для загрузки файла на FTP-сервер (https://gist.github.com/DavidDeSloovere/96f3a827b54f20d52bcfda4fe7a16a0b):

using (var fileStream = new FileStream(uploadfile, FileMode.Open))
    {
        Console.WriteLine("Uploading {0} ({1:N0} bytes)", uploadfile, fileStream.Length);
        client.BufferSize = 4 * 1024; // bypass Payload error large files
        client.UploadFile(fileStream, Path.GetFileName(uploadfile));
    }

Обратите внимание, что мы открываем FileStream для чтения файла и затем передаем ссылку Stream на SftpClientМогу ли я использовать System.IO.Pipelines здесь, чтобы уменьшить выделение памяти? Мне все еще нужно будет предоставить Stream для SftpClient.

1 Ответ

0 голосов
/ 16 января 2019

Отказ от ответственности: я не эксперт, просто собираю кусочки ...


Ответ (по состоянию на январь 2019 года), по-видимому, таков: официальной поддержки этому нет.

System.IO.Pipelines был создан в основном для случаев использования в сети .На самом деле, код конвейеров, выпущенный в 2.1, не имел поддержки каких-либо конечных точек :

Здесь нам нужно немного предостеречь и заявить об отказе: конвейеры, выпущенные в .NET Core 2.1, делаютне включает в себя какие-либо реализации конечных точек.

Предложен предложенный дизайн для API для универсального потокового адаптера, но это часть .NET Core 3.0 Milestone.

Кажется, даже имеет некоторую сдержанность для реализации доступа к файловым конвейерам (AKA * FileStream эквивалент конвейеров).Это особенно разочаровывает, так как я тоже надеялся на конвейерный файловый ввод / вывод.

Я думаю, что ваша лучшая ставка на данный момент - это использование UsePipe() методов в https://github.com/AArnott/Nerdbank.Streams


Обновление: Вот еще один пример, который я только что нашел https://github.com/tulis/system-io-pipelines-demo/tree/master/src/SystemIoPipelinesDemo/SystemIoPipelinesDemo


Обновление: Я попытался создать программу чтения файлов на основе конвейера.Вы можете прочитать все об этом здесь: https://github.com/atruskie/Pipelines.File.Unofficial

По сути, с точки зрения производительности, использование адаптера потокового конвейера, такого как Nerdbank.Streams, - хороший путь!

...