C# ApiController Post中的异步和等待
我仍然不太清楚async和wait在.NET4.5中的作用。到目前为止,我认为我理解等待: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
[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-holdreturn-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中异步的一致理解