Я пытаюсь скопировать входящий поток 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;
}
Возможно, вы решаете проблему с неправильной стороны. 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
. Хорошо, может оказаться, что вам не нужна копия вообще, когда вы обрабатывали каждый кусок.
Я думаю, вы имеете в виду что-то вроде этого:
private async Task<Stream> GetAudioStream(RecordingSession recordingSession)
{
var result = await Request.Content.ReadAsStreamAsync();
await result.CopyToAsync(recordingSession.AudioStream);
return recordingSession.AudioStream;
}
async методы возвращают задачи. Очень редко, если не-асинхронный метод возвращает задачу.