【发布时间】:2021-03-26 11:47:21
【问题描述】:
所以我已经尝试掌握了相当长的一段时间,但看不出将每个控制器端点声明为异步方法的意义。
让我们看一个 GET-Request 来可视化问题。
这是我处理简单请求的方式,只需完成工作并发送响应即可。
[HttpGet]
public IActionResult GetUsers()
{
// Do some work and get a list of all user-objects.
List<User> userList = _dbService.ReadAllUsers();
return Ok(userList);
}
下面是我经常看到的async Task<IActionResult> 选项,它与上面的方法相同,但方法本身返回一个Task。有人可能会认为,这个更好,因为您可以有多个请求进入并且它们异步处理但我测试了这种方法和上面的方法,结果相同。两者都可以同时接受多个请求。那么我为什么要选择这个签名而不是上面的那个呢?我只能看到这样的负面影响,例如由于异步将代码转换为状态机。
[HttpGet]
public async Task<IActionResult> GetUsers()
{
// Do some work and get a list of all user-objects.
List<User> userList = _dbService.ReadAllUsers();
return Ok(userList);
}
下面的这种方法也是我无法理解的。我看到很多代码都具有这种设置。一种async 方法await 然后返回结果。像这样等待会使代码再次顺序化,而不是获得多任务/多线程的好处。我错了吗?
[HttpGet]
public async Task<IActionResult> GetUsers()
{
// Do some work and get a list of all user-objects.
List<User> userList = await _dbService.ReadAllUsersAsync();
return Ok(userList);
}
如果你能用事实启发我,那就太好了,这样我就可以像现在一样继续发展,或者知道由于误解了这个概念而我做错了。
【问题讨论】:
-
因为异步操作返回一个任务,在任务完成之前它的结果是不可用的。
-
其实你应该这样看:当你创建一个基于任务的方法时,你本质上是在说你的方法使用了一些异步操作。它与调用者本身无关。调用者只知道它应该等待操作。