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

在C#中“return await”的目的是什么?

高嘉树
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();
}

我在很多地方看到了带有返回await的代码,我想我可能错过了什么。但据我所知,在本例中不使用Async/await关键字而直接返回任务在功能上是等价的。为什么要增加附加Await层的额外开销?

共有1个答案

长孙知
2023-03-14

在普通方法中的returnAsync方法中的return await行为不同:当与使用组合时(或者更一般地,在try块中使用任何return await)。

请考虑方法的这两个版本:

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

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

doanotherthingAsync()方法返回时,第一个方法将dispose()foo对象,这可能在它实际完成之前很久。这意味着第一个版本可能有buggy(因为foo释放得太快),而第二个版本可以正常工作。

 类似资料:
  • 这基本上是我之前问题的延续。 这是C 14中的[class]/7: 标准布局类是这样的类: (7.1)-没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员, (7.2)-没有虚拟函数(10.3)和虚拟基类(10.1), (7.3)-对所有非静态数据成员具有相同的访问控制(第11条), (7.4)-没有非标准布局基类, (7.5)-在大多数派生类中没有非静态数据成员,并且最多有一个基类具

  • 本文向大家介绍什么是C ++中的deque.erase()?,包括了什么是C ++中的deque.erase()?的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++中deque::erase()函数的工作,语法和示例。 什么是C ++ STL中的双端队列? 双端队列是双端队列,它是序列容器,在两端都提供扩展和收缩功能。队列数据结构允许用户仅在END插入数据,并从FRONT删除数

  • 正如Translation Django文档的本节所述,函数ugettext_noop是一个用于国际化的实用函数:

  • 我正在弄清楚如何使用Cocoapods,我发现了这个:pod install在cocoapods版本1.0.0.beta.1中显示错误 它说我必须写以下行:后面跟一些东西。但我对什么是我的“TargetName”感到困惑。 例如,此项目中的目标名称是什么: 或者,我在哪里可以找到我的项目的“目标”?我正在使用最新版本的Xcode。

  • 本文向大家介绍C#ASP.NET Core项目中Program.cs文件的用途是什么?,包括了C#ASP.NET Core项目中Program.cs文件的用途是什么?的使用技巧和注意事项,需要的朋友参考一下 ASP.NET Core Web应用程序实际上是一个控制台项目,它从Program类中的入口点public static void开始执行,我们可以在其中为Web应用程序创建主机。 虚拟主机提

  • 问题内容: 在Java中,方法用于流中。但是我不明白使用这种方法的全部目的是什么? 告诉我一些建议。 问题答案: 从该方法的文档中flush: 刷新输出流并强制写出所有缓冲的输出字节。刷新的一般约定是,调用它的指示是,如果先前写入的任何字节已由输出流的实现缓冲,则应立即将这些字节写入其预期的目标。