Работа с системой.Нарезка резьбы.Задачи.Задача вместо потока

я использовал метод, как показано ниже, в предыдущих версиях WCF Web API:

// grab the posted stream
Stream stream = request.Content.ContentReadStream;

// write it to   
using (FileStream fileStream = File.Create(fullFileName, (int)stream.Length)) {

    byte[] bytesInStream = new byte[stream.Length];
    stream.Read(bytesInStream, 0, (int)bytesInStream.Length);
    fileStream.Write(bytesInStream, 0, bytesInStream.Length);
}

но на предварительном просмотре 6,HttpRequestMessage.Content.ContentReadStream свойство исчезло. Я считаю, что теперь он должен выглядеть так:

// grab the posted stream
System.Threading.Tasks.Task<Stream> stream = request.Content.ReadAsStreamAsync();

но я не мог понять, как должна выглядеть остальная часть кода внутри оператора using. Может ли кто-нибудь предоставить мне способ сделать это?

3 ответов


возможно, Вам придется изменить это в зависимости от того, какой код происходит до/после, и нет никакой обработки ошибок, но что-то вроде этого:

Task task = request.Content.ReadAsStreamAsync().ContinueWith(t =>
{
    var stream = t.Result;
    using (FileStream fileStream = File.Create(fullFileName, (int) stream.Length)) 
    {
        byte[] bytesInStream = new byte[stream.Length];
        stream.Read(bytesInStream, 0, (int) bytesInStream.Length);
        fileStream.Write(bytesInStream, 0, bytesInStream.Length);
    }
});

Если позже в вашем коде вам нужно убедиться, что это завершено, вы можете вызвать task.Wait() и он будет блокировать, пока не будет завершено (или исключение).

рекомендую Шаблоны параллельного программирования чтобы ускорить некоторые из новых асинхронных шаблонов (задачи, данные параллелизм и т. д.) В .NET 4.


быстрое и грязное исправление:

// grab the posted stream
Task<Stream> streamTask = request.Content.ReadAsStreamAsync();
Stream stream = streamTask.Result; //blocks until Task is completed

имейте в виду, что тот факт, что версия синхронизации была удалена из API, предполагает, что вы действительно должны попытаться изучить новые асинхронные парадигмы, чтобы избежать поглощения многих потоков при высокой нагрузке.

вы могли бы, например:

streamTask.ContinueWith( _ => {
    var stream = streamTask.Result; //result already available, so no blocking
    //work with stream here
} )

или с новыми функциями async await:

//async wait until task is complete
var stream = await request.Content.ReadAsStreamAsync(); 

найдите время, чтобы узнать async / await. Это очень удобно.


вот как вы можете сделать это лучше с async и await:

    private async void WhatEverMethod()
    {
        var stream = await response.Content.ReadAsStreamAsync();

        using (FileStream fileStream = File.Create(fullFileName, (int)stream.Length))
        {
            byte[] bytesInStream = new byte[stream.Length];
            stream.Read(bytesInStream, 0, (int)bytesInStream.Length);
            fileStream.Write(bytesInStream, 0, bytesInStream.Length);
        }
    });