Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#异步调用操作_C#_Asp.net Mvc 4_Asynchronous_Async Await - Fatal编程技术网

C#异步调用操作

C#异步调用操作,c#,asp.net-mvc-4,asynchronous,async-await,C#,Asp.net Mvc 4,Asynchronous,Async Await,我有一个表单post,它应该异步调用一个操作 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(I

我有一个表单post,它应该异步调用一个操作

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    
   }
}
公共异步任务SaveW2Document(Models.DocumentData)
{
这里有一些代码
var ID=wait Task.Run(()=>somObject.SaveDocument(uploadDocument));
//使用ID的代码
如果(ID==某物){
//做点什么
}
}
但是,它会被同步调用,我的其他操作在该操作完成之前不会执行。我还需要做其他事情吗

我有一个表单post,它应该异步调用一个操作

我认为您误解了“异步”在本文中的含义。使用
async
控制器操作(或通常的HTTP请求处理程序)意味着web服务器可以异步调用操作,而不会在操作完成时将线程保持在等待状态。这允许web服务器更有效地处理更多并发请求

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

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


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

我可能无法正确提问。但我找到了出现问题的解决方案。MVC具有阻止来自同一会话的并发请求的行为。我必须禁用会话或使该控制器为只读。参考链接


因此,向我的控制器添加
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
会有所帮助。

它是如何同步调用的?有什么东西在等着它吗?(请注意,此代码中调用的唯一异步调用正在等待,因此此方法中的执行将停止,直到该操作完成。鉴于下一行依赖于该调用的结果,这是有意义的。)应异步调用该操作。i、 e UI应该可以自由处理当前未发生的其他内容。您是否像
wait SaveW2Document()
那样调用此方法?那么,UI是如何调用它的?异步方法本身并不定义如何调用它的同步。调用它的代码确实如此。既然这是一个web应用程序,我是否应该假设它是通过HTTP请求调用的?可以从客户端代码中使用AJAX异步执行请求。但是HTTP通常不是异步的,请求总是等待响应
async
在这种上下文中通常意味着允许web服务器释放资源,这样它就不会等待响应(并且可以处理更多并发请求),但浏览器是这样的。它会在问题的第一行中提到的表单帖子上被调用好的,让我解释一下。ajax调用会调出一个表单。我添加了文档和一些信息,这个表单由@using(Html.BeginForm(“SaveDocument”,“Home”,FormMethod.Post,new{enctype=“multipart/form data”,id=“uploadFile”})提交{//form code}然后它调用我在问题中写的动作。这个过程需要在后台进行。我不关心它的响应,我只关心动作中发生了什么(数据库中的条目)。我将在稍后访问此页面时处理响应。我无法使用ajax,因为在重新加载页面时调用将丢失。调用需要独立于UI@nnm:在这种情况下,语句
“我不关心它的响应”
“我不能使用AJAX”
是互斥的。如果没有响应,页面会显示什么?它将是空白的。当您对新页面(GET或POST)执行页面级请求时,浏览器需要等待该响应,然后才能显示该响应中的内容。如果您希望操作是“开火并忘记”,那么您需要在后台调用它。在web浏览器中,这意味着AJAX。表单在提交后消失。用户界面上有一条消息“稍后再来查看”,因此没有空白页。其他链接是可见的和可访问的。你说的后台调用是什么意思?这就是我想要通过一个异步操作来完成的。那么,如果我使用ajax来调用这个操作而不是表单post,它会工作吗?@nnm:那么是什么产生了“稍后再来查看”的消息呢?它可能是从这个方法返回的
ActionResult
?如果UI需要显示此方法的结果,它将如何在不等待此方法完成的情况下显示?使用AJAX,您可以在不卸载页面上下文的情况下调用它,因此UI可以在不等待响应的情况下继续工作。但是,“稍后返回查看”消息仍需要等待响应,因为在操作完成之前,UI不知道操作是否成功/失败。“稍后返回”消息将独立于jquery的操作进行处理。当用户稍后访问该网站时,他将能够看到此添加的文档。最佳做法是尽可能将SessionState设置为只读。您应该尽最大努力只在用户登录/注销时写入会话,以便使所有其他控制器保持只读会话状态。