【问题标题】:Task without async/await in controller action method控制器操作方法中没有异步/等待的任务
【发布时间】:2020-01-20 12:29:52
【问题描述】:

所以我有一个关于任务和异步/等待操作的问题。

我有这样的方法:

public Task<IActionResult> PostCompleteFormModel(string name, [FromBody]IndicatorFormApi apiModel, Guid participantId, [FromServices] IChallengeCycleService challengeCycleService)
{
    return Post(name, apiModel.ToSubmitApi(), participantId, challengeCycleService);
}

在控制器中。

如您所见,它没有 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);
}

那么使用 async/await 关键字?

还是没有区别?

谢谢

【问题讨论】:

标签: c# multithreading .net-core


【解决方案1】:

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

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

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

作为一般规则,I recommend keeping the async and await keywords unless the method is trivial and will not throw an exception。例如,本质上提供默认参数值的重载。在这种特定情况下,ToSubmitApi 是一个单独的方法,可能会抛出(或将来可能会更改为抛出),因此我建议保留 async 和 await 关键字。

【讨论】:

  • 好吧,但这到底有什么好处呢? “因此,如果 ToSubmitApi 引发异常,该异常将直接引发给调用者,而不是放在返回的任务上”
  • @niceCoderToTheBest:省略 async 和 await 的唯一好处是性能略有提高,因为没有额外的堆栈机器。
  • 好的,明白了。但是你说的省略是什么意思?或者那是一种类型?
  • @niceCoderToTheBest:“elide”的意思是“留下一些东西”。所以省略async和await就是写一个没有async和await的异步方法。
【解决方案2】:

通过添加“async/await”,您允许应用程序不阻塞调用者线程,这反过来会增加方法的吞吐量,因为它会变成异步的。如果没有 async/await(或不进行异步),您拥有的方法将是同步的,这意味着第二个调用者必须等到第一个调用者完成执行(如果是单线程异步),因为第一个调用者会阻塞线程直到它完成执行。

在 async/await 中要记住的一件事不会提高应用程序的性能,但会增加应用程序的吞吐量,因此下一个请求不需要等到最后一个请求完成。例如,假设您的方法需要 5 秒才能完成执行,但添加 async/await 不会减少执行时间,但它将允许在 5 秒内处理多个请求。假设您有 3 个请求要同时处理,那么没有 async/await 每个需要 5 秒,这意味着完成所有请求需要 15 秒。通过添加 async/await,所有三个请求在 5 秒内完成(假设)。

【讨论】:

  • 我还有一个问题。但是Task的目的是什么?所以没有异步/等待
猜你喜欢
  • 2020-02-11
  • 2023-03-08
  • 2014-05-15
  • 2015-07-05
  • 1970-01-01
  • 2015-10-05
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多