我考虑用System.IO.Pipelines代替应用程序中基于流的IO,以避免不必要的内存分配(首先考虑RecyclableMemoryStream,但似乎已经停止了)。但是在某些地方,由于外部库所强加的接口,我仍然不得不使用Stream。因此,我的PipeWriter将需要将其数据包装在一个流中。
在这个主题上,我没有发现太多,但是在回答另一个问题时,我发现了一个使用装饰模式(C#流管(流监视))的建议。我不确定将管道隐藏在流包装器后面是正确的,但是找不到任何能让我将数据管道传输到流的东西。我是不是遗漏了什么?
最新消息。下面是一个使用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来读取一个文件,然后将一个流引用传递给一个SftpClient。我可以在这里使用System.IO.Pipelines来减少内存分配吗?我仍然需要为SftpClient提供一个流。
发布于 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这样的管道流适配器是一个很好的方法!
发布于 2021-04-05 14:39:23
现在,它似乎是利用AsStream()扩展PipeReader的一种方式:
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));
}https://stackoverflow.com/questions/53801581
复制相似问题