【发布时间】:2020-11-10 19:22:38
【问题描述】:
我在 youtube 上观看了 Les Jackson 的一些视频,介绍了如何创建 .net 核心 API。 Les 将这种方法用于他的控制器中的方法
public ActionResult<IEnumerable<Command>> GetAllCommands()
{
var commandItems = _repository.GetAppCommands();
return Ok(commandItems);
}
但是我刚刚阅读了使用这种方法的书中的一篇文章
public async Task<ActionResult<IEnumerable<Data.CityDataClass>>> GetCities()
{
return await _repository.GetCities();
}
在我看来,第二种方法是使用“异步”声明的过度杀伤力吗?第一种方法在得到结果之前不会返回任何东西。
谢谢
【问题讨论】:
-
"第一个方法在得到结果之前不会返回任何东西。"是的,但它会保持线程阻塞,直到结果准备好。在某些情况下,这不是问题 - 在其他情况下可能是。 (假设您的服务器负载很重,并且此方法需要一段时间......您是否希望每个未完成的调用都占用一个线程?)
-
这能回答你的问题吗? How and when to use ‘async’ and ‘await’
-
“第二种方法是使用“async”声明的矫枉过正吗?”这取决于。如果您的方法是
async,那么您必须等待它(除非它具有同步等效项)。如果您可以选择这两种方法,那么判断哪种方法更快的唯一真正方法就是对其进行测试。基本上,如果您有一个集中式服务,那么async/await可以防止线程饥饿。如果您的服务没有受到这种影响,那么同步等效可能会更好,因为它避免了上下文切换的开销,但最终唯一的判断方法是对其进行负载测试。 -
您可能对eliding async/await的优缺点感兴趣。
标签: c# async-await task-parallel-library