Task.Result 与 .GetAwaiter.GetResult() 相同吗?

2024-02-19

我最近正在阅读一些使用大量异步方法的代码,但有时需要同步执行它们。该代码的作用是:

Foo foo = GetFooAsync(...).GetAwaiter().GetResult();

这是否与

Foo foo = GetFooAsync(...).Result;

Task.GetAwaiter().GetResult()优先于Task.Wait and Task.Result因为它传播异常而不是将它们包装在AggregateException。然而,这三种方法都可能导致死锁和线程池饥饿问题。应该避免它们async/await.

下面的引用解释了原因Task.Wait and Task.Result不简单地包含异常传播行为Task.GetAwaiter().GetResult()(由于“兼容性非常高”)。

正如我之前提到的,我们有非常高的兼容性标准,因此我们避免了重大更改。像这样,Task.Wait保留其始终包裹的原始行为。但是,您可能会发现自己处于某些高级情况下,您需要类似于使用的同步阻塞的行为Task.Wait,但是您希望原始异常以未包装的形式传播,而不是将其封装在AggregateException。为此,您可以直接定位任务的等待者。当你写“await task;”,编译器将其转换为使用Task.GetAwaiter()方法,它返回一个实例,该实例具有GetResult()方法。当用于有故障的任务时,GetResult()将传播原始异常(这就是“await task;”得到它的行为)。因此,您可以使用“task.GetAwaiter().GetResult()”如果你想直接调用这个传播逻辑。

https://devblogs.microsoft.com/pfxteam/task-exception-handling-in-net-4-5/ https://devblogs.microsoft.com/pfxteam/task-exception-handling-in-net-4-5/

GetResult”实际上意味着“检查任务是否有错误”

一般来说,我会尽力避免同步阻塞异步任务。然而,在少数情况下我确实违反了该准则。在那些罕见的情况下,我首选的方法是GetAwaiter().GetResult()因为它保留了任务异常而不是将它们包装在AggregateException.

https://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html https://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html

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

Task.Result 与 .GetAwaiter.GetResult() 相同吗? 的相关文章

随机推荐

  • 获取没有函数参数的二叉树的高度

    import java util Scanner public class BinaryTree private int info private BinaryTree left private BinaryTree right priva
  • 在 dplyr 中使用字符串作为过滤器?

    有没有办法在 dplyr 中使用字符串变量作为过滤器参数 例如 filter iris Sepal Length gt 6 将被替换为 string lt Sepal Length gt 6 filter iris string 基本上 我
  • 管理中的 AbstractController::DoubleRenderError

    我正在从事疯狂商务工作 我正在尝试调整 active sale controller 中的几个操作 我有一些条件 如果条件失败 我将重定向到 返回 否则我将继续下一步 我现在面临的问题是我在同一个操作中使用了两次redirected to
  • 无法安装 Visual Studio 2013 更新 5 (RTM); Apache Cordova 工具

    我正在尝试安装 VS2013 更新 5 但它不会安装 因为它被阻止 我必须 通过控制面板卸载旧版本的 Visual Studio Tools for Apache Cordova 多设备混合应用程序 我已经按照要求卸载了它 尽管与 VS20
  • Node js Express 中的环境变量(.env)

    是否可以为所有不同的部署环境 例如开发 生产等 提供一个 env 文件 根据环境 需要加载相应的环境变量文件 是的 您可以使用dotenv https github com motdotla dotenv module例如 env DB H
  • 在没有 JavaScript 的情况下将 HTML 元素与父元素的中间对齐

    我想在元素中间放置一个 水平对齐很容易 当然垂直对齐也可以用JS来完成 但我确信用CSS有更好的方法 有什么窍门呢 附 我需要这个用于具有 HTML5 元素的应用程序 因此我不介意该解决方案是否仅适用于支持画布的浏览器和 IE 7 8 使用
  • 使用 Typescript 时如何更新 Next-auth 中会话回调中的会话类型

    我正在使用打字稿 我的 next auth tsx 文件如下所示 import NextAuth Awaitable Session User from next auth import GithubProvider from next a
  • 如何使用try catch语句抛出错误?

    Utility const readUserUtility id a gt const currentstore store getState const returnedArray currentstore users filter us
  • 使用多个跟踪侦听器

    我有 2 个 WCF 服务 它们是从单个 Windows 主机托管的 我使用跟踪侦听器将数据记录到应用程序日志中 我已将以下代码添加到配置文件中
  • 插入符号训练的公式和非公式结果不同

    我注意到在训练时使用插入符中的公式和非公式方法会产生不同的结果 此外 公式方法所需的时间几乎是非公式方法所需时间的 10 倍 这是预期的吗 gt z lt data table c1 sample 1 1000 1000 replace T
  • 在 TeamCity 中全局禁用 FxCop 错误

    好的 今天还有一个 FxCop 问题 我已经阅读了有关 IdentifiersShouldBeCasedCorrectly 规则的争论 以及它是否应该是 XML 或 Xml 嗯 我是一个 XML 人 并且我想保持这种状态 因此 我做not希
  • 使用集束搜索实现 seq2seq

    我现在正在实施seq2seq基于示例代码的模型tensorflow提供 我想得到一个top 5解码器进行强化学习的输出 然而 他们用注意力解码器实现了翻译模型 所以我应该实现波束搜索来获取top k结果 现在有一部分代码已实现 该代码被添加
  • 无内存屏障的乱序写入:数据争用的唯一可能原因?

    在经历的同时Java 并发实践 作者 Brian Goetz我遇到了以下行 当一个变量被多个线程读取时 就会发生数据竞争 并由至少一个线程写入 但读取和写入不是按发生之前排序 正确同步的程序之一是 没有数据竞争 正确同步的程序表现出顺序 一
  • 这是 Xamarin Forms 中的内存泄漏吗?

    我遇到了一个问题 页面对象一旦被导航离开 就不会被垃圾收集 我整理了一个非常基本的示例 演示了使用 NavigationPage 和 PushAsync 方法时出现的问题 该页面使用弱引用列表显示 活动 页面的数量 public class
  • tar:错误不可恢复:现在退出

    当我解开教义时 rw r r 1 root root 660252 2010 10 16 23 06 Doctrine 1 2 0 tgz 我总是收到此错误消息 root X100e usr local lib Doctrine stabl
  • 何时在带有react-dom的jest单元测试中使用act()

    根据反应单元测试文档 act 要为断言准备组件 请包装代码渲染 它并在 act 调用中执行更新 这使得你的测试 运行起来更接近 React 在浏览器中的工作方式 但测试在这两种情况下都运行得很好 没有 act it Should retur
  • Linux堆栈的动态扩展

    我注意到 Linux 堆栈开始时很小 然后由于递归 推送 vlas 达到大小而导致页面错误而扩展getrlimit RLIMIT STACK 给予或接受 在我的系统上默认为 8MiB 但奇怪的是 如果我通过直接寻址字节来导致页面错误 在限制
  • 如何将 Web 服务绑定到特定 glassfish 端口?

    I have Glassfish 3 1 1 Metro JAX WS stack 在我的域的虚拟服务器中安装多个 http 侦听器 当我部署 EAR 时 Web 应用程序和肥皂服务都绑定到所有可用的 http 侦听器 而我希望它们由不同的
  • Gas .org 与 nasm 中的 ORG 不同吗?

    我使用 gnu 作为简单的启动 是这样的 text org 0x7c00 start movw 0x7c0 ax movw ax ds movw ax es leaw greeting msg si call prtstr end fill
  • Task.Result 与 .GetAwaiter.GetResult() 相同吗?

    我最近正在阅读一些使用大量异步方法的代码 但有时需要同步执行它们 该代码的作用是 Foo foo GetFooAsync GetAwaiter GetResult 这是否与 Foo foo GetFooAsync Result Task G