2017-02-15 28 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唱回返回的任務。該方法立即退出。

在第二個示例中,您將任務交給基類,該基類爲您處理任務並等待其執行。

如果您不想返回任務,例如如果你想要做的事它完成後,你可以標記你的方法爲asyncawait任務,像這樣:

[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

如果返回適合你,那很好。否則,你可以看看這個包,它基本上增加了對.NET 4.0的異步/等待支持。www.nuget.org/packages/Microsoft.Bcl.Async –