Стрим дизайн до-диез - PullRequest
       37

Стрим дизайн до-диез

0 голосов
/ 17 ноября 2011

Каков наилучший способ создания потокового прокси-сервера для конвертации в C#?

Предположим, у меня есть некоторый входной поток, и я хочу сделать что-то похожее на boost::iostreams.

Так, например, я могу zlib упаковать прокси в поток, чтобы при доступе к содержимому ZlibWrappedStream(initialStream) я получал данные из initialStream, но упаковывал их с помощью zlib?

Как это может быть разработано с учетом того факта, что различные прокси могут применяться один за другим , а также с учетом возможности многопоточной упаковки?

1 Ответ

1 голос
/ 17 ноября 2011

.NET потоки уже позволяют цепочку, о которой вы говорите.Например, если я хочу сжать данные и сохранить их в файле, я могу написать следующее:

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 большее окно сжатия.

Многопоточная упаковка не должна быть проблемой, если вы ограничиваете все свои многопоточные операциик внутренностям класса.Если вы хотите, чтобы несколько потоков могли выполнять одновременную запись в поток, вам придется создать какой-то механизм синхронизации, чтобы предотвратить чередование данных во входном буфере.Опять же, если вы ограничиваете эту синхронизацию внутренними классами, то проблем быть не должно.То же самое относится и к многопоточному распаковыванию и чтению.

...