设计打包/转换流代理的最佳方法是C#
什么?
假设,我有一些输入流,我希望做一些类似的事情boost::iostreams
。
因此,例如,我可以将zlib
代理打包到流中,这样当我访问 的内容时ZlibWrappedStream(initialStream)
,我会从 接收数据initialStream
,但使用zlib
?
考虑到可以一个接一个地应用不同的代理以及考虑多线程打包的可能性,如何设计呢?
设计打包/转换流代理的最佳方法是C#
什么?
假设,我有一些输入流,我希望做一些类似的事情boost::iostreams
。
因此,例如,我可以将zlib
代理打包到流中,这样当我访问 的内容时ZlibWrappedStream(initialStream)
,我会从 接收数据initialStream
,但使用zlib
?
考虑到可以一个接一个地应用不同的代理以及考虑多线程打包的可能性,如何设计呢?
.NET 流已经允许您正在谈论的链接。例如,如果我想 gzip 数据并存储到文件中,我可以编写以下内容:
using (var fs = File.OpenWrite(outputFilename))
{
using (var gz = new GZipStream(fs, CompressionMode.Compress))
{
// now, write to the GZip stream . . .
gz.Write(buffer, 0, buffer, length);
}
}
你可以让这个链条任意长。比如我经常BufferedStream
在前面放一个,GZipStream
给gzip一个更大的压缩窗口。
多线程打包应该不是问题,只要您将所有多线程操作限制在类的内部即可。如果您希望多个线程能够同时写入流,则必须创建某种同步机制来防止输入缓冲区中的数据交错。同样,如果您将同步限制在类内部,那么应该没有问题。同样的事情也适用于多线程解包和读取。