2017-02-15 6 views
0

Я хочу знать, если кто-нибудь знает, потому что происходит это:ReadAsMultipartAsync не работает

, это не работает:

[AcceptVerbs("POST")] 
public void AddFile() 
{ 
    if (!Request.Content.IsMimeMultipartContent("form-data")) 
    { 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
    }    

    var streamProvider = new MultipartFormDataMemoryStreamProvider(); 
    Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t => 
    { 
     .... 
    }); 
} 

Но если он работает (является правильным решением?) :

[AcceptVerbs("POST")] 
public Task AddFile() 
{ 
    if (!Request.Content.IsMimeMultipartContent("form-data")) 
    { 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
    }    

    var streamProvider = new MultipartFormDataMemoryStreamProvider(); 
    return Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t => 
    { 
     .... 
    }); 
} 

ответ

0

В первом примере вы не обрабатываете пойте возвращенную задачу от ReadAsMultipartAsync. Метод немедленно завершает работу.

Во втором примере вы задаете задачу базовому классу, который обрабатывает задачу для вас и ждет ее выполнения.

Если вы не хотите возвращать задачу, например. если вы хотите сделать что-то после того, как он закончит, вы можете пометить свой метод как async и await задача так:

[AcceptVerbs("POST")] 
public async Task AddFile() 
{ 
    if (!Request.Content.IsMimeMultipartContent("form-data")) 
    { 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
    }    

    var streamProvider = new MultipartFormDataMemoryStreamProvider(); 
    await Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t => 
    { 
     .... 
    }); 
} 
+1

Смешивание ContinueWith и асинхр/ожидают, приводит к проблемам, вобще 'ждут Request.Content.ReadAsMultipartAsync (streamProvider); 'и все в' .ContinueWith' просто пойдет после нормального кода 'await'. –

+0

Но я использую .NET 4.0 и не могу этого сделать. Я считаю, что лучше использовать только возвращение. – Cristian18

+0

Если возвращение работает для вас, все в порядке. В противном случае вы можете взглянуть на этот пакет, он в основном добавляет поддержку async/awend для .NET 4.0 www.nuget.org/packages/Microsoft.Bcl.Async –