我考虑在我们的应用程序中使用System.IO.Pipelines替换基于Stream的IO,以避免不必要的内存分配(首先考虑RecyclableMemoryStream,但它似乎已经停产了)。但是在某些地方,由于外部库施加的接口(interface),我仍然必须使用Stream。因此,我的PipeWriter将需要将其数据包装在Stream中。
在这个主题上我没有找到太多内容,但是找到了在其他问题的答案中使用装饰器模式(C# Stream Pipe (Stream Spy))的建议。我不确定将流水线隐藏在Stream包装器后面是否是正确的选择,但是找不到其他可以将数据通过管道传输到流中的东西。我想念什么吗?
更新。这是一个使用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减少内存分配吗?我仍然需要为SftpClient提供一个Stream。
最佳答案
免责声明:我不是专家,只是拼凑而成...
答案(截至2019年1月)似乎是:对此没有官方支持。
System.IO.Pipelines主要是为networking use cases创建的。实际上,在2.1中发布的管道代码具有no support for any endpoints:
通用流适配器有一个proposed design for an API,但这是.NET Core 3.0里程碑的一部分。
甚至seems to be some reticence都可以实现基于文件的管道访问(也称为FileStream
管道等效)。这特别令人失望,因为我也希望管道支持文件I/O。
我认为目前最好的选择是使用https://github.com/AArnott/Nerdbank.Streams中的UsePipe()
方法
更新:这是我刚刚找到的另一个示例https://github.com/tulis/system-io-pipelines-demo/tree/master/src/SystemIoPipelinesDemo/SystemIoPipelinesDemo
更新:我可以制作基于管道的文件阅读器。您可以在这里阅读所有相关信息:https://github.com/atruskie/Pipelines.File.Unofficial
本质上,从性能角度来看,使用管道流适配器(如Nerdbank.Streams)是一个不错的选择!
关于c# - 将System.IO.Pipelines与Stream结合使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53801581/