2011-11-17 4 views
0

C#에 패킹/변환 스트림 프록시를 설계하는 가장 좋은 방법은 무엇입니까?스트림 디자인이 날카로운

내가 입력 스트림을 가지고 있다고 가정하고 boost::iostreams과 유사한 것을 만들고 싶습니다. 그래서 나는 ZlibWrappedStream(initialStream)의 내용을 액세스 할 때

그래서, 예를 들어, 내가 스트림에 zlib 포장 프록시는, 나는 initialStream에서 데이터를 수신하지만, zlib를 사용하여 포장 할 수 있습니까?

다른 프록시 이 차례로 적용되고이 적용될 수 있으며 멀티 스레드 패킹 가능성을 고려하여 어떻게 설계 할 수 있습니까?

답변

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을 넣어 gzip에 더 큰 압축 창을 제공합니다.

모든 멀티 스레드 작업을 클래스의 내부 구조로 제한하는 한 다중 스레드 패킹은 문제가되지 않습니다. 여러 스레드가 동시에 스트림에 쓸 수있게하려면 입력 버퍼에서 데이터 인터리빙을 방지하기 위해 일종의 동기화 메커니즘을 만들어야합니다. 다시 말해, 동기화를 클래스 내부로 제한하면 문제가 발생하지 않아야합니다. 멀티 쓰레드 풀기와 읽기에는 같은 종류의 것이 적용됩니다.