C#异步调用一个动作

时间:2015-01-19 13:57:07

标签: c# asp.net-mvc-4 asynchronous async-await

我有一个表单帖子应该异步调用一个动作。

public async Task<ActionResult> SaveW2Document(Models.DocumentData documentData)
{
    some code here
    var ID = await Task.Run<int>(() => somObject.SaveDocument(uploadDocument));
   //Code that uses ID
   if(ID == something){
       //Do something    
   }
}

然而,它会被同步调用,而我的其他操作在此操作完成之前不会执行。这是否还需要我做其他事情?

2 个答案:

答案 0 :(得分:2)

  

我有一个表格帖子应该异步调用一个动作。

我认为你误解了什么&#34;异步&#34;意味着在这种情况下。使用async控制器操作(或一般的HTTP请求处理程序)意味着 Web服务器可以异步调用操作,而不会在操作完成时将线程保持在等待状态。这允许Web服务器更有效地处理更多并发请求。

然而,浏览器 等待响应。任何给定操作的异步性质通常不是由操作本身定义的,而是由调用它的任何东西定义的。 (例如,请注意在此操作中如何等待另一个异步操作。如果此代码没有等待它,则行为将会非常不同。但是调用的方法在这两个方案之间不会发生变化。)

但这是有道理的。毕竟,如果浏览器没有等待来自服务器的响应,它将会做什么?显示空白页?

您可以通过使用AJAX从客户端代码对Web服务器进行异步调用。这将允许页面调用服务器端操作并侦听响应,而不会阻止或更改页面本身的上下文。但是,如果整个页面上下文发布到服务器并等待加载新页面,则需要接收该新页面才能显示它。

答案 1 :(得分:0)

好吧,我可能无法正确地提出这个问题。但我找到了问题的解决方案。 MVC具有阻止来自同一会话的并发请求的行为。我将要么必须禁用会话,要么只为该控制器进行只读。请参阅this链接。

所以将[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]添加到我的控制器有帮助。