【问题标题】:Nested async methods... do I need to await?嵌套的异步方法...我需要等待吗?
【发布时间】:2022-02-08 06:55:25
【问题描述】:

假设我有一个现有的async 方法返回一个运行良好的任务。它等待并且本身被正确等待。此方法采用int 参数:

public async Task<MyType> MyMethod(int foo)
{
    // .. do stuff 
}

我们想更新这个方法来接受一个字符串,如果我们可以从字符串中解析一个 int,然后做我们一直做的事情(移动到一个新的辅助方法),否则,如果我们可以解析一个Guid,然后调用不同(但非常相似)的方法。如果两种类型都不会解析,则返回空/noop 结果:

public async Task<MyType> MyMethod(string foo)
{
    if ( int.TryParse(foo, out int bar))
    {
        return MyIntHelper(bar);
    }
    else if (Guid.TryParse(foo, out Guid bar))
    {
        return MyGuidHelper(bar);
    }
    else return MyNoop();
}

private async Task<MyType> MyIntHelper(int foo)
{
    // original ".. do stuff" here
}

private async Task<MyType> MyGuidHelper(Guid foo)
{
    // similar ".. do stuff" here, but using a Guid instead
}

问题是,在更新的MyMethod() 中,我是否需要await 辅助方法的结果,或者因为我已经返回了一个任务并且任何必要的等待仍在调用者和子方法中我已经介绍过了?

作为一些背景知识,这是在更新控制器以接受额外的“端点”的上下文中,但实际上我想尽可能地将问题与该上下文分离。

【问题讨论】:

  • MyMethod 并不真正需要异步。您可以从任一辅助方法返回任务。虽然这确实改变了调用者观察异常的方式。
  • @JeremyLakeman 作为目标的一部分是尽可能地匹配原件,它可能应该保持异步。但我对这个问题持开放态度。
  • 由于MyMethod 在第一个潜在await 之前完成了所有工作,然后立即返回结果。使其成为异步方法只会增加复杂性。唯一外部可见的副作用是MyMethodawait 之前抛出异常。并且调用者只会关心他们是否有类似var task = ....; &lt;something&gt;; await task;

标签: c# async-await


【解决方案1】:

在更新的 MyMethod() 中,是否需要等待辅助方法的结果

如果你使用async,那么你应该使用await。作为一般规则,您应该对大多数异步方法使用asyncawait

任何时候你有重要的逻辑(包括异常的可能性),你应该使用asyncawait。对于琐碎的方法实现,您可以elide async and await(如我的博客所述)。

【讨论】:

  • OP,这个答案对你有帮助吗?您能否接受它或评论它为什么没有帮助?这样做会帮助以后阅读此问题的其他人
猜你喜欢
  • 2012-07-31
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多