当前位置: 首页 > 知识库问答 >
问题:

当您可以直接返回任务<T>时,为什么要使用异步和返回等待?

桂梓
2023-03-14

是否存在这样的编写方法:

public async Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return await DoAnotherThingAsync();
}

而不是这个:

public Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return DoAnotherThingAsync();
}

会有意义吗?

当您可以直接返回< code >任务时,为什么要使用< code>return await构造

我在很多地方看到带有返回wait的代码,我想我可能错过了一些东西。但据我了解,在这种情况下不使用async/wait关键字并直接返回任务在功能上是等效的。为什么要增加额外的wait层的额外开销?

共有3个答案

长孙鸿
2023-03-14

您想这样做的唯一原因是如果在早期代码中还有其他wait,或者您在返回结果之前以某种方式操作结果。可能发生这种情况的另一种方式是通过改变异常处理方式的try/catch。如果您没有做任何这些,那么您是对的,没有理由增加使方法async的开销。

燕实
2023-03-14

如果您不需要异步(即,您可以直接返回任务),则不要使用异步

在某些情况下,return-await非常有用,例如,如果您有两个异步操作要执行:

var intermediate = await FirstAsync();
return await SecondAwait(intermediate);

有关异步性能的更多信息,请参阅Stephen Toub关于该主题的MSDN文章和视频。

更新:我已经写了一篇博文,内容更加详细。

南宫阳冰
2023-03-14

在普通方法中返回async方法中返回wait时,有一种偷偷摸摸的情况:当与使用的组合时(或者,更一般地,try块中的任何返回wait)。

考虑方法的这两个版本:

Task<SomeResult> DoSomethingAsync()
{
    using (var foo = new Foo())
    {
        return foo.DoAnotherThingAsync();
    }
}

async Task<SomeResult> DoSomethingAsync()
{
    using (var foo = new Foo())
    {
        return await foo.DoAnotherThingAsync();
    }
}

只要< code > DoAnotherThingAsync()方法返回,第一个方法就会< code>Dispose()该< code>Foo对象,这很可能在它实际完成之前很久。这意味着第一个版本可能有问题(因为< code>Foo被处理得太快了),而第二个版本会工作得很好。

 类似资料:
  • 问题内容: 我想创建一个函数来检查user_id是否已在我的数据库中。 但是,是第三方Firebase提供的API。它定义为return 。 (void)observeSingleEventOfType:(FEventType)eventType withBlock:(void(^)(FDataSnapshot * snapshot))块 错误: 感谢任何帮助。 更新 我正在尝试另一种方式: 不知

  • 我用webpack建立了一个浏览器umd库。 我正在侦听输入文件的onchange事件。当有人提交图像/文件时,它会将其转换为base64。我试图让它尽可能看起来不那么明显,所以我使用了promises和wait/asynchttps://blog.shovonhasan.com/using-promises-with-filereader/. 但是,有一个问题-当我调用convertToBase

  • 我有一个windows服务,我从另一个开发人员继承,它运行非常慢,并有许多对eBay API的缓慢调用。我希望在没有太多重构的情况下加快它。 我刚刚开始研究使用C#Async/Await来尝试让这些缓慢的调用运行异步。以下是我试图实现的目标: 如何获取返回的类型以便使用它们?我尝试使用,但它只有属性可用。

  • 问题内容: 据我所知,使用或实例化对象分别返回或的新实例。具有 新标识 的新实例对象。 在我实际测试它之前,这对我来说是很清楚的,我注意到它实际上返回了而不是预期的: 如预期的那样,分别使用和创建对象时,也会表现出这种行为: 我可以在状态文档中找到唯一相关的信息: […]例如,return和return 。 如果未提供任何参数,则构造函数将创建一个新的空元组。 可以说,这不足以回答我的问题。 那么

  • 我已经阅读并测试了所有这些答案(这个,这个和这个),但没有帮助(这也不是我第一次在这种情况下使用嘲笑,但这种情况对我来说很少见)。 我使用和进行单元测试。在测试时,我模拟了和并将它们传递给了它,一切正常,但没有返回空值,这是我的代码: 页反恐精英: PageViewModel: ViewModelTest.cs:

  • 问题内容: 为什么要退货我可以ping通IP。 问题答案: 在很多情况下,方法对我来说并不值得使用。你可以滚动到底部以查看我的替代方法,该方法可以简单地测试你是否在线并且能够解析外部主机(例如google.com)…这似乎通常可以在机器上使用。 问题 关于此有很多chat不休: 这是其他类似的问题: 使用Java检测互联网连接 如何使用Java测试互联网的可用性? 甚至在同一件事上有报告的错误: