C# ApiController Post中的异步和等待

C# ApiController Post中的异步和等待,c#,asynchronous,asp.net-web-api,async-await,C#,Asynchronous,Asp.net Web Api,Async Await,我仍然不太清楚async和wait在.NET4.5中的作用。到目前为止,我认为我理解等待: 将函数(位于其右侧)放在单独的线程上 将执行返回到当前函数的调用方 但保留当前函数的其余代码“人质”,直到等待(异步)函数完成 如果我误解了什么,请纠正我。因此,如果上述是真的,我就只能使用我想要异步的ApicController的Post函数: [HttpPost] public async Task<HttpResponseMessage> Post([FromBody]MyObject

我仍然不太清楚async和wait在.NET4.5中的作用。到目前为止,我认为我理解等待:

  • 将函数(位于其右侧)放在单独的线程上
  • 将执行返回到当前函数的调用方
  • 但保留当前函数的其余代码“人质”,直到等待(异步)函数完成
  • 如果我误解了什么,请纠正我。因此,如果上述是真的,我就只能使用我想要异步的ApicController的Post函数:

    [HttpPost]
    public async Task<HttpResponseMessage> Post([FromBody]MyObject obj)
    {        
         myDataContext.MyObjects.InsertOnSubmit(obj);
         myDataContext.SubmitChanges();
    
         await SomeReallyLongRunningTaskAsync();        
    
         // obj would now have the new Id, which I'm really after.
         return Request.CreateResponse(HttpStatusCode.Created, obj);
    
    }
    
    [HttpPost]
    公共异步任务Post([FromBody]MyObject obj)
    {        
    myDataContext.MyObject.InsertOnSubmit(obj);
    myDataContext.SubmitChanges();
    等待某个ReallyLongRunningTaskAsync();
    //obj现在有了新的身份证,我真的很想要。
    返回请求.CreateResponse(HttpStatusCode.Created,obj);
    }
    
    所以,如果我理解正确,Post将完成执行并将控制权返回给调用
    myApiController.Post(obj)
    的人。但是我还没有
    HttpResponseMessage
    对象,因为wait-hold
    return-Request.CreateResponse(HttpStatusCode.Created,obj)“人质”

    在上面这个简单的例子中,调用是否会立即返回到客户端(即客户端JS网站或移动应用)?如果是的话,它会是201400500(最好不是),其他的吗

    将函数(位于其右侧)放在单独的线程上

    否。
    async
    不会启动新线程。我有一个建议,你可能会觉得有用

    Post将完成执行并将控制权返回给调用myApiController.Post(obj)的人。但是我还没有HttpResponseMessage对象

    在上面这个简单的例子中,调用是否会立即返回到客户端(即客户端JS网站或移动应用)


    不。ASP.NET MVC 4.5看到您返回的是
    任务
    ,而不是
    HttpResponseMessage
    ,因此它不会发送响应,直到您的
    任务
    完成(在
    异步
    Post
    方法结束时)。

    除了Stephen的回答之外,我还需要指出一些事情

    首先,控制器中的异步不会使用户体验异步。用户必须等待
    SomeReallyLongRunningTaskAsync()
    的时间。[那我们为什么要做异步呢?请看下一点]

    另外,如果
    SomeReallyLongRunningTaskAsync()
    受CPU限制,则不应在异步模式下调用它。在服务器场景中使用异步的主要原因是将CLR线程释放回线程池,以便IO完成端口(IOCP)可以处理其余部分,直到IO工作完成,然后返回到线程池。这将防止ASP.NET场景中常见的线程不足问题

    IOCP仅在IO绑定的情况下使用,例如:

    • 读取/写入文件
    • 访问数据库或
    • 访问外部Web服务或WCF服务
    网上有大量可用的资源,可以解释各个方面。如果我可以插一句话,这是一个优秀的资源,它提供了对Web API中异步的一致理解