作者:林小志525家 | 来源:互联网 | 2022-11-24 20:10
我考虑在我们的应用程序中使用System.IO.Pipelines替换基于Stream的IO,以避免不必要的内存分配(首先考虑RecyclableMemoryStream,但它似乎已停产)。但是在某些地方,由于外部库施加的接口,我仍然必须使用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。
1> Anthony Trus..:
免责声明:我不是专家,只是拼凑而成...
答案(截至2019年1月)似乎是:对此没有官方支持。
System.IO.Pipelines主要是为网络用例创建的。实际上,2.1中发布的管道代码不支持任何端点:
这里我们需要一些警告和免责声明:.NET Core 2.1中发布的管道不包含任何终结点实现。
有一个针对通用流适配器的API的建议设计,但这是.NET Core 3.0里程碑的一部分。
甚至似乎对实现基于文件的管道访问(也称为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)是个不错的选择!