我有一个表单帖子应该异步调用一个动作。
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
}
}
然而,它会被同步调用,而我的其他操作在此操作完成之前不会执行。这是否还需要我做其他事情?
答案 0 :(得分:2)
我有一个表格帖子应该异步调用一个动作。
我认为你误解了什么&#34;异步&#34;意味着在这种情况下。使用async
控制器操作(或一般的HTTP请求处理程序)意味着 Web服务器可以异步调用操作,而不会在操作完成时将线程保持在等待状态。这允许Web服务器更有效地处理更多并发请求。
然而,浏览器 等待响应。任何给定操作的异步性质通常不是由操作本身定义的,而是由调用它的任何东西定义的。 (例如,请注意在此操作中如何等待另一个异步操作。如果此代码没有等待它,则行为将会非常不同。但是调用的方法在这两个方案之间不会发生变化。)
但这是有道理的。毕竟,如果浏览器没有等待来自服务器的响应,它将会做什么?显示空白页?
您可以通过使用AJAX从客户端代码对Web服务器进行异步调用。这将允许页面调用服务器端操作并侦听响应,而不会阻止或更改页面本身的上下文。但是,如果整个页面上下文发布到服务器并等待加载新页面,则需要接收该新页面才能显示它。
答案 1 :(得分:0)
好吧,我可能无法正确地提出这个问题。但我找到了问题的解决方案。 MVC具有阻止来自同一会话的并发请求的行为。我将要么必须禁用会话,要么只为该控制器进行只读。请参阅this链接。
所以将[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
添加到我的控制器有帮助。