【发布时间】:2018-12-16 11:10:06
【问题描述】:
我考虑在我们的应用程序中用 System.IO.Pipelines 替换基于 Stream 的 IO,以避免不必要的内存分配(首先考虑 RecyclableMemoryStream,但它似乎已停止使用)。但是在某些地方,由于外部库强加的接口,我仍然必须使用 Stream。所以我的 PipeWriter 需要将其数据包装在 Stream 中。
我没有找到关于这个主题的太多内容,但在另一个问题的答案中找到了使用装饰器模式 (C# Stream Pipe (Stream Spy)) 的建议。我不确定将 Pipelines 隐藏在 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。
【问题讨论】:
-
您能否再解释一下您希望达到的目标。
-
@Gilad 我用这个例子更新了我的问题。