2009-11-04 3 views
3

압축 -> 암호화 -> 파일 I/O를하는 일련의 스트림이 있다고 가정합니다. 이 같은 동기 I/O,이 보일 것이다 무언가를 사용하여 C#에서 스트림 체인에 비동기 I/O (BeginWrite/BeginRead)가 미치는 영향은 무엇입니까?

:

int n=0; 
    byte[] buffer= new byte[2048]; 
    string inputFileName = "input.txt"; 
    string outputFileName = inputFileName + ".compressed.encrypted"; 
    using (FileStream inputFileStream = File.Open(inputFileName, FileMode.Open, FileAccess.Read)) 
    { 
     using (FileStream outputFileStream = File.Open(outputFileName, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      using (Stream encryptor = new EncryptingStream(fs)) 
      { 
       using (Stream compressor = new CompressorStream(encryptor)) 
       { 
        while ((n = inputFileStream.Read(buffer, 0, buffer.Length)) > 0) 
        { 
         compressor.Write(buffer, 0, n); 
        } 
       } 
      } 
     } 
    } 

하는 I/O를 FileStream을 제공하는 비동기을 활용하려면, 난 단순히 그러면 BeginWrite를 (사용할 수없는 가정) 메소드를 호출합니다.

이 예제에서는 FileStream에서 비동기 I/O를 사용하기 위해 EncryptingStream이 래핑 된 Stream에서 BeginWrite/EndWrite를 호출하여 Write를 구현해야한다고 생각합니다. 래핑 된 Stream이 FileStream이면 asynch I/O를 얻습니다. 그 맞습니까?

+0

'BeginWrite'라고하는 가장 안쪽의 스트림이 어떻게 될지 궁금한가요? – pomeroy

답변

2

외부 스트림 (여기서는 compressor)에서 BeginWrite을 호출하면 작업을 스레드 풀로 성공적으로 옮길 수 있으므로 호출 방법과 관련하여 비동기 적으로 실행하게됩니다. 이것은 아마 당신의 어플리케이션에 적당 할 것이지만 가능한 최대 효율은 아닙니다. 여러분이 지적한대로 BeginWrite은 실제로 디스크 I/O를 수행하는 내부 FileStream에는 사용되지 않습니다. 여기서 BeginWrite이 사용되는 경우 FileStreamBeginWrite 구현은 높은 확장 성을 제공하는 "Windows 완료 포트 API"를 이용합니다.

이 방법을 보는 또 다른 방법은 운영 체제 측면에서 볼 때 비동기 I/O가 아닙니다. 그러나 스레드 풀 스레드에서 동 기적으로 실행되므로 효과적으로 다른 모든 코드와 비동기 적으로 동작합니다. 운영 체제 비동기 I/O를 실제로 활용하려면 완료 포트 API를 사용할 수있는 클래스에서 BeginWrite으로 전화해야합니다.

정확히 어떤 압축을 사용하고 있는지 확실하지 않으므로 이것을 소금 한 알과 함께 섭취하십시오. 예를 들어 StreamBeginWrite을 구현하지 않았거나 동 기적으로 구현할 수 있습니다.

+1

'BeginWrite' (예 :'compressor.BeginWrite')의 외 부 호출이 프록시 된 스트림 (예 :'EncryptingStream')에서'BeginWrite'를 호출하지 않고 오히려 'encryptor.Write'를 호출하십시오. – pomeroy

관련 문제