所以我有一个关于 Task 和 async/await 操作的问题。
我有一个这样的方法:
public Task<IActionResult> PostCompleteFormModel(string name, [FromBody]IndicatorFormApi apiModel, Guid participantId, [FromServices] IChallengeCycleService challengeCycleService)
{
return Post(name, apiModel.ToSubmitApi(), participantId, challengeCycleService);
}
Run Code Online (Sandbox Code Playgroud)
在控制器中。
正如你所看到的,它没有 async/await。
但是这样做不是更好吗:
public async Task<IActionResult> PostCompleteFormModel(string name, [FromBody]IndicatorFormApi apiModel, Guid participantId, [FromServices] IChallengeCycleService challengeCycleService)
{
return await Post(name, apiModel.ToSubmitApi(), participantId, challengeCycleService);
}
Run Code Online (Sandbox Code Playgroud)
那么使用 async/await 关键字?
或者不让它有所不同?
谢谢
这两种方法都是异步的,但它们的语义略有不同。具体来说,如果ToSubmitApi抛出异常,它们的行为会有所不同。
该async关键字创建一个状态机,它负责管理返回Task。如果async方法中的代码抛出异常,则async状态机将捕获该异常并将其放在返回的Task. 这是返回 的方法的预期语义Task。
如果没有async关键字,该方法将调用ToSubmitApi,然后调用Post并Task返回从Post. 因此,如果ToSubmitApi抛出异常,该异常将直接引发给调用者,而不是放在返回的Task. 这些语义不是预期的。
作为一般规则,我建议保留asyncandawait关键字,除非该方法是微不足道的并且不会抛出异常。例如,本质上提供默认参数值的重载。在这种特定情况下,ToSubmitApi是一个单独的方法,可能会抛出(或将来可能会更改为抛出),因此我建议保留asyncandawait关键字。
| 归档时间: |
|
| 查看次数: |
580 次 |
| 最近记录: |