我仍然不太清楚 .net 4.5 中的 async 和 wait 。到目前为止,我想我明白了等待:
- 将函数(在其右侧)放在单独的线程上。
- 将执行返回给当前函数的调用者
- 但会“劫持”当前函数代码的其余部分,直到等待(异步)函数完成。
如果我误解了什么,请纠正我。所以,如果上述情况成立,我就被 ApiController 的 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);
}
因此,如果我理解正确的话,Post 将完成执行并将控制权返回给调用者myApiController.Post(obj)
。但我没有HttpResponseMessage
对象尚未举行等待return Request.CreateResponse(HttpStatusCode.Created, obj);
“人质”。
在上面这个简单的例子中,调用会立即返回到客户端(即客户端 JS 网站或移动应用程序)吗?如果是这样,会是 201、400、500(最好不要)还是其他?
除了斯蒂芬的回答之外,我还需要指出一些事情。
首先,控制器中的异步不会使用户体验异步。用户必须等待SomeReallyLongRunningTaskAsync()
需要。 [那么我们为什么要做异步呢?参见下一点]
另外,如果SomeReallyLongRunningTaskAsync()
是 CPU 限制的,那么你不应该在异步模式下调用它。这主要原因在服务器场景中使用异步是将 CLR 线程释放回池中所以这样IO 完成端口 (IOCP)可以处理剩下的事情 - 直到 IO 工作完成,然后返回到线程池。这将防止出现以下问题线程饥饿这在 ASP.NET 场景中很常见。
使用 IOCPONLY in IO-bound情况,例如:
- 读取/写入文件
- 访问数据库或
- 访问外部 Web 服务或 WCF 服务
网上有大量资源可以解释各个方面。如果我可以插上插头,本书第二章 https://rads.stackoverflow.com/amzn/click/com/1430247258是一个优秀的资源,它可以让您对 Web API 中的异步有一个统一的理解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)