2014-03-27 99 views
1

我有一些代碼,它導入一個csv文件並從數據創建數據庫記錄。使用標準的同步方法可以正常工作,但大型csv文件可能需要一段時間才能處理。使用異步等待,我想csv處理異步運行,所以用戶不會卡在上傳表單,直到處理完成。MVC異步等待長時間運行的數據庫插入/更新

因此,用戶將上傳文件並立即轉移到一個頁面,該頁面將顯示一條消息以指示該文件正在導入。

這是我試過的。這是我的控制器的行動,獲取表單POST:在本

public async Task<ActionResult> UploadBulkImportFile(BulkUploadCsvModel model, HttpPostedFileBase file) 
{ 
... 

我打電話,我要異步運行的功能:

await Task.Run(() => testAsyncMethod(csvmodel)); 

的testAsyncMethod()做了所有的數據庫CRUD參與操作處理csv。

public void testAsyncMethod(IEnumerable<List<csvmodel>> model) 
{ 
... 

此代碼的工作,但我前面的同步代碼沒有什麼不同,即用戶仍然必須等待,直到該文件被完全處理,所以它顯然不正常。請注意,testAsyncMethod()中的代碼不是異步代碼,只是標準的數據庫調用 - 我想知道如果這是我出錯的地方。

這甚至可能在MVC?我是否使用異步等待錯誤的原因?

+0

這不是如何異步工作... –

+0

@ErikFunkenbusch - 照顧開導我? – markpsmith

+0

斯蒂芬的博客文章,他鏈接到下面明確解釋...但是,異步允許*服務器*繼續做其他事情,而不是客戶端(網絡瀏覽器) –

回答

3

因此,用戶將上傳文件,並立即轉移到一個頁面,該頁面將顯示一條消息以指示該文件正在導入。

這不可能使用異步控制器操作。這是因爲(正如我在我的博客中描述的)async does not change the HTTP protocol

在你的情況,我建議你在客戶端JavaScript來斷火的POST,當前頁更改爲「導入......」的字樣,然後更新同一頁當POST請求完成。

然後從您的控制器操作中刪除async/await/Task.Run;它不會提供任何好處。

+0

實時報告是不重要的,我只是想要特定位的功能異步運行。您的博客文章很有用,實際上這部分'您可以在服務器上發明「工作流程」的概念:POST調用可以創建工作流程'聽起來像我想做的事情 – markpsmith

+0

是的;這實際上是一個更復雜的解決方案,但肯定是可行的。在這種情況下,您需要擁有一個擁有獨立後端的持久隊列(例如,Azure隊列/ MSMQ)(例如,Azure worker/Win32服務)。 –

+0

在做了一些更多的研究後,我認爲我所追求的本質上是一場「火與忘」的異步調用,儘管這不是沒有缺點。 – markpsmith