5

我正在使用MVC4 ApiController將數據上傳到Azure Blob。以下是示例代碼:在MVC 4異步ApiController中使用Task.Factory.StartNew?

public Task PostAsync(int id) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     // CloudBlob.UploadFromStream(stream); 
    }); 
} 

此代碼是否有意義?我認爲ASP.NET已經在工作線程中處理請求,所以在另一個線程中運行UploadFromStream似乎沒有意義,因爲它現在使用兩個線程來運行此方法(我假設原始工作線程正在等待此UploadFromStream以完成?)

所以我的理解是,異步ApiController只有有意義的,如果我們使用一些內置的異步方法,如HttpClient.GetAsync或SqlCommand.ExecuteReaderAsync。這些方法可能在內部使用I/O完成端口,因此可以在執行實際工作時釋放線程。所以我應該改變這個代碼?

public Task PostAsync(int id) 
{ 
    // only to show it's using the proper async version of the method. 
    return TaskFactory.FromAsync(BeginUploadFromStream, EndUploadFromStream...) 
} 

在另一方面,如果所有的郵政法的工作是CPU /內存密集型,然後異步版本PostAsync將不利於吞吐量要求。使用常規的「公共無效Post(int id)」方法可能會更好,對嗎?

我知道這是很多問題。希望它能夠闡明我對ASP.NET MVC中異步使用的理解。謝謝。

回答

1

是的,你說的大部分都是正確的。甚至完成端口等細節。

這是一個很小的錯誤:

I assume the original worker thread is waiting for this UploadFromStream to finish?

只有你的任務線程運行。畢竟你使用的是異步管道。它不會等待任務完成,它只是連接一個延續。 (就像使用HttpClient.GetAsync一樣)。