2013-07-06 65 views
2

使用MVC 4應用程序。我需要執行某些數據庫調用,而無需阻止當前的操作方法執行。MVC 4中的異步調用4

public ActionResult Save(Employee e){ 

    bool saveStatus = EmployeeService.Save(e); 

    if(saveStatus){ 
    AuditService.Add("Employee {0} added successfully", e.Name); //want this async 
    } 
    return View(e); 

} 

在上面的代碼中,我想使AuditService調用爲異步。

當我保存員工信息時,我需要返回視圖而不是等待AuditService調用。

我在MVC是新來asyncawait 4.

+0

你的這段代碼只能由iis處理異步,所以它不會在等待db調用完成時浪費線程。但是ot會​​一直等到數據庫調用完成後才能找到一個新線程並返回最終結果。除了Kamyar的回答,你也可以考慮AJAX – peter

回答

2

我認爲使用Task是一個更好的方法在這裏:

if(saveStatus){ 
    new Task(AuditService.Add("Employee {0} added successfully", e.Name)).Start(); 
} 

更新:
斯蒂芬在他的回答中指出,這可能導致您的進行中的工作丟失。

3

正如我在我的博客上描述的,async does not change the HTTP protocol。你要求的是如何從HTTP請求返回提前;這與async/await沒有任何關係。

關於早期返回HTTP請求:你幾乎從來沒有想要做到這一點。

如果你的「審計」服務實際上是一個日誌 - 你是偶爾的日誌信息完全沒有被記錄 - 再(和那麼)你可以使用的方法like I describe on my blog

否則,你不應該提前回來。也就是說,如果您的「審計」服務實際上用於審計,那麼如果您希望日誌準確無誤。在這種情況下,你不能提前回來。

0

你做錯了。您不能在簡單控制器的任何操作中運行異步。因爲客戶端的代碼在服務器代碼完成時運行並且沒有意義。

取決於你的目標,你可以做下一個: