【问题标题】:Why is sometimes async keyword not used with a method suffixed with async?为什么有时 async 关键字不与带有 async 后缀的方法一起使用?
【发布时间】:2020-03-12 21:16:43
【问题描述】:

我正在阅读有关 asp.net core 中的健康检查。

我看过这段代码。

public class ExampleHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default(CancellationToken))
    {
        var healthCheckResultHealthy = true;

        if (healthCheckResultHealthy)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("A healthy result."));
        }

        return Task.FromResult(
            HealthCheckResult.Unhealthy("An unhealthy result."));
    }
}

在上面的代码中,CheckHealthAsync 方法没有被标记为异步。是不是同时支持同步和异步功能?

【问题讨论】:

  • 它不需要标记为异步。它返回一个Task,使其与外界异步。
  • 如果方法使用await 运算符,则只需标记async。此方法不使用await 运算符。
  • @juunas 我觉得你的评论很混乱。名称中包含 Async 不会使它是异步的。这只是一个命名约定。
  • 是的。它只是一个命名约定,在这里使用是因为返回了一个任务。
  • "TAP 中的异步方法在操作名称后面包含 Async 后缀,用于返回等待类型的方法,例如 Task、Task、ValueTask 和 ValueTask。" - Naming, parameters, and return types

标签: c# asp.net-core async-await


【解决方案1】:

这个答案分为两部分:

  • Async 后缀用于满足IHealthCheck 接口要求。它只是一种命名约定(尽管很重要),在语言本身中没有特殊含义。
  • async 没有被使用,因为方法的实现不需要它(即它没有awaits)

请注意,该实现也使用Task.FromResult,而不是直接返回值。这样做也是为了满足IHealthCheck 接口的要求,该接口旨在允许实现异步。

【讨论】:

    【解决方案2】:

    async 只允许您使用 await,如果您正在寻找一种方法来判断某些东西是否异步运行,那么 Task 的返回类型是您最好的提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 2018-09-13
      • 2022-01-21
      相关资源
      最近更新 更多