Как перенаправить поток Request.Content

1

Я пытаюсь скопировать входящий поток HTTP в другой поток и использовать его вместо этого.

Когда я использую 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;
    }
Теги:
stream
task-parallel-library

2 ответа

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 во время его записи, но теперь я понимаю, что невозможно читать из записываемого потока.
0

Я думаю, вы имеете в виду что-то вроде этого:

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

async методы возвращают задачи. Очень редко, если не-асинхронный метод возвращает задачу.

  • 0
    Спасибо, но это не решает проблему. Он либо блокируется, пока все данные не передаются в потоковом режиме, либо немедленно возвращается, если я удалю второе ожидание.
  • 0
    Правильно, это потому, что ваш вызывающий метод должен ожидать завершения вызова GetAudioStream ().
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню