2014-05-23 6 views
1

들어오는 HTTP 스트림을 다른 스트림으로 복사하고 대신 사용하려고합니다.Request.Content stream 리디렉션하는 방법

Request.Content.ReadAsStreamAsync().Result을 직접 사용하면 모든 것이 정상적으로 작동합니다.

내가 직면하고있는 문제는 원본 스트림을 다른 스트림으로 "전송"하는 방법입니다. 나는 흐르는 방법을 썼지 만 문제는 모든 스트림 데이터가 도착할 때까지 기다렸거나 (Wait()를 사용할 때) 또는 즉시 반환되고 데이터를 캡처하지 않고 존재한다는 것입니다.

private Task<Stream> GetAudioStream(RecordingSession recordingSession) 
    { 

     Task<Stream> task = Task<Stream>.Factory.StartNew(() => 
     { 
      Request.Content.ReadAsStreamAsync().Result.CopyToAsync(recordingSession.AudioStream).Wait(); 
      return recordingSession.AudioStream; 
     }); 

     return task; 
    } 
+0

비동기 작업을 시작한 다음 기다리는 습관이 있습니다. 그건 말이 안돼. – usr

+0

@usr 물론,하지만 기다리지 않으면 코드가 즉시 종료되고 데이터가 없습니다. 이것이 실제 질문입니다. – user3077725

+0

그런 다음, 나는 당신이 원하는 것이 무엇인지 분명하지 않습니다. 두 가지 선택 사항이 있습니다. 즉시 반환하고 완료되면 돌아갑니다. 그 밖에 무엇을 원하십니까? – usr

답변

2

아마도 문제는 잘못된 쪽에서 다루어집니다. CopyToAsync 스트림의 복사본을 제공하며 Task은 모든 데이터가 복사 될 때 CopyToAsync에 의해 반환됩니다.

static async Task<Stream> CopyAndProcessAsync(RecordingSession recordingSession, CancellationToken token) 
{ 
    var srcStream = await Request.Content.ReadAsStreamAsync(); 

    var dstStream = recordingSession.AudioStream; 

    var buffer = new byte[4096]; 
    int bytesRead; 
    while ((bytesRead = await srcStream.ReadAsync(buffer, 0, buffer.Length, token).ConfigureAwait(false)) != 0) 
    { 
     await dstStream.WriteAsync(buffer, 0, bytesRead, token).ConfigureAwait(false); 

     // do whatever you want with the chunk 
     PlaybackChunk(buffer); 
    } 

    return dstStream; 
} 

: 당신이 스트림의 전체 전체 사본이 필요하지 않거나 모든 데이터 기다리지 않으려면

, 다음 자신과 과정 각 청크 수동으로 복사 그렇지 않으면 귀하의 GetAudioStream 결과를 소비하고 싶을 때마다이 작업을 수행하십시오. 각 청크를 처리 할 때 사본이 전혀 필요 없다는 것이 잘 드러날 수 있습니다.

+1

필자가해야 할 일은, recordingSession.AudioStream이 쓰여지는 동안 그것을 사용하는 것이지만, 지금은 쓰여지고있는 스트림에서 읽을 수 없다는 것을 이해합니다. – user3077725

0

난 당신이 같은 것을 의미 생각 :

private async Task<Stream> GetAudioStream(RecordingSession recordingSession) 
{ 
    var result = await Request.Content.ReadAsStreamAsync(); 
    await result.CopyToAsync(recordingSession.AudioStream); 
    return recordingSession.AudioStream; 
} 

비동기 방법이 작업을 반환합니다. 비동기 메소드가 태스크를 리턴하는 경우는 거의 없습니다.

+0

고마워요,하지만이 문제가 해결되지 않습니다. 모든 데이터가 스트리밍 될 때까지 차단되거나 두 번째 대기 시간을 제거하면 즉시 반환됩니다. – user3077725

+0

호출 메서드가 GetAudioStream() 호출 완료를 기다려야하기 때문입니다. –

+0

GetAudioStream()에서 기다리고 있지만 즉시 반환됩니다. – user3077725