首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将System.IO.Pipelines与流结合使用

将System.IO.Pipelines与流结合使用
EN

Stack Overflow用户
提问于 2018-12-16 11:10:06
回答 2查看 8.9K关注 0票数 9

我考虑用System.IO.Pipelines代替应用程序中基于流的IO,以避免不必要的内存分配(首先考虑RecyclableMemoryStream,但似乎已经停止了)。但是在某些地方,由于外部库所强加的接口,我仍然不得不使用Stream。因此,我的PipeWriter将需要将其数据包装在一个流中。

在这个主题上,我没有发现太多,但是在回答另一个问题时,我发现了一个使用装饰模式(C#流管(流监视))的建议。我不确定将管道隐藏在流包装器后面是正确的,但是找不到任何能让我将数据管道传输到流的东西。我是不是遗漏了什么?

最新消息。下面是一个使用SSH.NET开源库将文件上载到FTP服务器(https://gist.github.com/DavidDeSloovere/96f3a827b54f20d52bcfda4fe7a16a0b)的示例:

代码语言:javascript
复制
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来读取一个文件,然后将一个流引用传递给一个SftpClient。我可以在这里使用System.IO.Pipelines来减少内存分配吗?我仍然需要为SftpClient提供一个流。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-16 06:35:37

免责声明:我不是专家,只是把这些碎片拼凑起来.

答案(截至2019年1月)似乎是:官方对此没有支持。

System.IO.Pipelines主要是为联网用例创建的。事实上,2.1中发布的管道代码有不支持任何端点

在这里,我们需要一些警告和免责声明:在.NET Core2.1中发布的管道不包括任何端点实现。

有一个通用流适配器的API的拟议设计,但这是.NET Core3.0里程碑的一部分。

甚至还有似乎有些沉默来实现基于文件的管道访问(AKA,FileStream管道等效)。这尤其令人失望,因为我也希望使用管道供电的文件I/O。

我认为您目前最好的选择是在https://github.com/AArnott/Nerdbank.Streams中使用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这样的管道流适配器是一个很好的方法!

票数 11
EN

Stack Overflow用户

发布于 2021-04-05 14:39:23

现在,它似乎是利用AsStream()扩展PipeReader的一种方式:

代码语言:javascript
复制
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
        var pipeReader = PipeReader.Create(fileStream);
        client.UploadFile(pipeReader.AsStream(), Path.GetFileName(uploadfile));
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53801581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档