在C#
中设计打包/转换流代理的最佳方法是什么?
假设我有一些输入流,我想做一些与boost::iostreams
类似的事情。
因此,例如,我可以zlib
将代理打包到流中,这样当我访问ZlibWrappedStream(initialStream)
的内容时,我会收到来自initialStream
的数据,但是使用了zlib
?
考虑到不同的代理可以一个接一个地应用并且还考虑多线程打包的可能性这一事实,如何设计这个?
答案 0 :(得分:1)
.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一个更大的压缩窗口。
多线程打包应该不是问题,只要您将所有多线程操作限制在类的内部。如果您希望多个线程能够同时写入流,则必须创建某种同步机制以防止在输入缓冲区中交错数据。同样,如果您将该同步限制为类内部,那么应该没有问题。同样的事情适用于多线程拆包和阅读。