控制器动作方法中没有异步/等待的任务

0 c# multithreading .net-core

所以我有一个关于 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 关键字?

或者不让它有所不同?

谢谢

Ste*_*ary 7

这两种方法都是异步的,但它们的语义略有不同。具体来说,如果ToSubmitApi抛出异常,它们的行为会有所不同。

async关键字创建一个状态机,它负责管理返回Task。如果async方法中的代码抛出异常,则async状态机将捕获该异常并将其放在返回的Task. 这是返回 的方法的预期语义Task

如果没有async关键字,该方法将调用ToSubmitApi,然后调用PostTask返回从Post. 因此,如果ToSubmitApi抛出异常,该异常将直接引发给调用者,而不是放在返回的Task. 这些语义不是预期的。

作为一般规则,我建议保留asyncandawait关键字,除非该方法是微不足道的并且不会抛出异常。例如,本质上提供默认参数值的重载。在这种特定情况下,ToSubmitApi是一个单独的方法,可能会抛出(或将来可能会更改为抛出),因此我建议保留asyncandawait关键字。