编译器是否对异步方法链执行“返回值优化”

2023-11-25

不是传统意义上的返回值优化,但我想知道你什么时候会遇到这样的情况:

private async Task Method1()
{
    await Method2();
}

private async Task Method2()
{
    await Method3();
}

private async Task Method3()
{
    //do something async
}

这显然可以写得更优化:

private Task Method1()
{
    return Method2();
}

private Task Method2()
{
    return Method3();
}

private async Task Method3()
{
    //do something async
}

我只是想知道是否有人知道(MS)编译器是否足够聪明,不会为以下内容生成状态机Method1() and Method2()第一个例子?


不,C# 编译器不会优化它,而且它不应该。这些在概念上是两个不同的东西,这是一个类似的问题.

IMO,主要区别在于异常如何传播到调用者中Method1 and Method2。我演示了这种行为here.

在第一种情况下(没有状态机),会出现异常立即地抛出到调用者的堆栈帧上。如果无人操作,应用程序可能会立即崩溃(除非有另一个async同一堆栈帧上的调用链中的方法)。

在第二种情况下(使用状态机),将保留异常dormant in the Task对象返回给调用者,直到通过观察到它await task or task.Wait(), 一段时间之后。它可能会在完全不同的堆栈帧上被观察到,或者可能根本不会被观察到。我发布了一些关于此的更多详细信息here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器是否对异步方法链执行“返回值优化” 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • C#/Excel:解决图表上的最大系列大小

    我需要帮助以编程方式绘制比单个 Excel 系列所能容纳的更多点 根据http office microsoft com en us excel HP100738491033 aspxExcel 2007 图表上可显示的最大点数为 2560
  • Android 中的多级 ExpandableListView

    我正在尝试从给定的未知大小或级别的类别列表创建类别树 所以我试图创建一个通用的可扩展列表 其中可以包含 2 个以上的级别 总体思路是在其布局中向每个有子级的子级添加另一个 ExpandableListView 问题是第二个级别无法打开 看起
  • 在 @PostConstruct 期间使用 @Cacheable 的 Spring 缓存不起作用

    与spring框架中的commit相关https github com spring projects spring framework commit 5aefcc802ef05abc51bbfbeb4a78b3032ff9eee3 初始化
  • Spring Security 3.0.2 的 OpenId 身份验证和自动注册

    我正在使用 spring security 3 0 2 和 OpenId 登录和注册来实现一个应用程序 我可以成功登录 但如果用户未注册 我想要执行以下操作 1 获取一些 OpenId 属性 例如电子邮件和姓名 2 向用户显示仅包含这两个字
  • 如何列出 MySQL 中缓存的查询? (Qcache_queries_in_cache)

    显示 Qcache queries in cache 等状态返回 Variable name Value Qcache queries in cache 327 如何打印这些 327 查询 为了优化 mysql 缓存 我想尝试切换到 按需
  • 如何在 Scala 2.9.0 中实现 Hadoop Mapper?

    当我从 2 8 1 迁移到 Scala 2 9 0 时 除了 Hadoop 映射器之外 所有代码都可以正常运行 因为我有一些包装对象 所以我总结为以下示例 import org apache hadoop mapreduce Mapper
  • 如何在 Java 中对二维数组进行深层复制?

    我刚刚使用了一点 clone 在我的第二天booleanarray 认为这是一个深拷贝 我怎样才能执行我的深度复制boolean array 我应该循环它并做一系列System arraycopy s 是的 您应该迭代二维布尔数组才能深度复
  • 扩展方法如何工作?

    我想在 Unity3d 中为 Vector3 类创建一个扩展方法 但我似乎不太明白 这就是我所拥有的 public static class ExtensionMethods public static Vector3 MaxValue t
  • 如何检查是否安装了特定的 MSI?

    我正在编写一个 powershell 脚本 它将为我的 web 应用程序安装一些依赖项 在我的脚本中 我遇到了一个反复出现的问题 即检查是否安装了特定应用程序 似乎有一种独特的方法来检查每个应用程序是否存在应用程序 即 通过检查 c 上此文
  • 使用 gettext 翻译 R 脚本

    是否可以使用 gettext 之类的东西来翻译 R 脚本 如果是这样 怎么办 如果没有 我还有什么其他选择 您可以使用base gettext ngettext base bindtextdomain 和tools xgettext2pot
  • 编辑开始时更改 UITextField 背景

    我想在 UITextField 成为第一个响应者时更改其背景图像 以向用户显示它具有焦点 类似于 CSS 中的 active 或 focus 伪类 我猜我可能需要以编程方式执行此操作 因此 非常感谢任何帮助 Giles 恕我直言 最干净的方
  • 在函数中操作多维数组

    我在这里读了很多东西并尝试了很多 但我找不到一种方法将多维数组传递给 C 中的函数 更改一些值并以某种方式返回新数组 找到一种方法将该数组进一步传递给另一个函数并执行相同的操作非常重要 我想找到一种将数组传递给函数的方法 然后将其从第一个函
  • 为什么我不能改变自我价值?

    为什么我可以这样改变 自我 self map x x 2 或者这样 self replace self map x x 2 但不是这样 self self map x x 2 为什么 Ruby 不允许我更改 self 变量指向的对象 但允许
  • 最小起订量 你如何测试内部方法?

    我的老板告诉我使用起订量 就是这样 我喜欢它 但似乎与 MSTest 或 mbunit 等不同 你无法测试内部方法 所以我被迫在我的界面中公开一些内部实现 以便我可以测试它 我错过了什么吗 您可以使用 Moq 测试内部方法吗 多谢 您可以使
  • Yii2 QueryBuilder 更新与连接

    我有以下原始 SQL 查询 UPDATE pay audit JOIN invoice items ON invoice items mdn pay audit account id AND invoice items unitprice
  • 登录时未从 Facebook API 获取电子邮件

    我在登录时遇到问题 即使将电子邮件添加到用户和朋友权限 对于某些 Facebook 帐户 我也无法收到电子邮件 我正在使用 facebook php sdk 这是我使用的代码 facebook user profile facebook g
  • 插件 ID 包含无效的字符“:”(仅 ASCII 字母数字字符、“.”、“_”和“-”字符是有效的 JETPACK COMPOSE

    我想在我的 android 项目中安装 jetpack compose 我正在遵循这个指南 https developer android com jetpack compose interop adding 但是当我尝试同步项目时 我的
  • 在 Go 中使用原始套接字

    我正在尝试编写一个程序 该程序接收 DHCP 发现 UDP 并根据 DHCP 数据包中特定字段 GIADDR 的内容 使用不同的源 IP 地址将它们转发到给定的 IP 地址 我可以开始处理接收和发送位 但在使用本地计算机上未配置的 IP 地
  • 是否可以检查 jQuery.post() 的超时?

    我有这段代码请求来自 mysql 数据库的一些文件夹信息 function gotoDir pmcat id pcat id slideshowContainer html img class loader src javascript a
  • 编译器是否对异步方法链执行“返回值优化”

    不是传统意义上的返回值优化 但我想知道你什么时候会遇到这样的情况 private async Task Method1 await Method2 private async Task Method2 await Method3 priva