我已经尝试了相当长一段时间,但无法理解为什么需要将每个控制器端点声明为异步方法。
让我们通过GET请求来看待这个问题。
对于简单的请求,我的方式就是处理请求并发送响应。
[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);
}
如果您能为我提供一些事实,让我了解是否由于误解概念而错误地开发,或者继续像现在这样进行开发才是正确的,那将是很好的。