Task.Run(async () => wait MethodAsync()).Result 和 MethodAsync().Result 之间有什么区别吗? [关闭]

2023-12-07

我需要实现一个不支持异步的第三方接口,特别是来自 automapper 的 IValueResolver。

我想知道这两段代码有什么区别?使用第一个而不是第二个有什么优点吗?我将在 MethodAsync() 上调用外部异步 API

两者都会锁定该线程还是仅锁定第二个线程?

1

var myValue = Task.Run(async () => await MethodAsync()).Result;

2

var myValue = MethodAsync().Result;

1)

var myValue = Task.Run(async () => await MethodAsync()).Result;

异步方法的同步部分MethodAsync将在线程池线程中运行。

2)

var myValue = MethodAsync().Result;

异步方法的同步部分MethodAsync将在调用者的线程中运行。

现在你可能会问,异步方法的同步部分是什么?

同步部分是第一个之前的所有内容await在异步方法内部。

更准确地说:同步部分是第一个之前的所有内容await未完成的等待。

通常同步部分很小,但是当我们谈论未知的外部 API 时,我们不能 100% 确定。

在调用者线程或线程池线程中运行阻塞代码之间的区别可能并不那么重要。在这两种情况下,调用者的线程将在异步调用的整个持续时间内被阻塞。第一种方法是否(Task.Run)有什么优势吗?通常是Task.Run添加解决死锁问题,这很容易发生在await and Wait/Result是混合的。在您的情况下,如果您使用,可能会出现此类问题await由于某种原因在内部,或者外部 API 使用await内部没有ConfigureAwait(false)。在这种情况下,您会立即注意到它,并且可能会修复它。所以使用的好处是Task.Run主动就是安心。缺点是使用线程池线程来运行该方法的同步部分。在大多数情况下,这部分非常小,以微秒为单位测量,因此如果您遵循简单的路径,您不应该感到内疚。


Update:这是第一种方法的示例,它还演示了外部方法的同步和异步部分:

private void Button1_Click(object sender, EventArgs e)
{
    this.Text = YourMethod();
}

public static int YourMethod()
{
    return Task.Run(async () => await ExternalMethodAsync()).Result;
}

public static async Task<string> ExternalMethodAsync()
{
    Thread.Sleep(500); // Synchronous part
    await Task.Delay(500).ConfigureAwait(false); // Asynchronous part
    return $"Time: {DateTime.Now:HH:mm:ss.fff}";
}

在这种情况下,预防性使用Task.Run是多余的,因为外部库遵循 waiting with 的良好实践ConfigureAwait(false).

这是第二种方法的示例:

public static int YourMethod()
{
    return ExternalMethodAsync().Result;
}

public static async Task<string> ExternalMethodAsync()
{
    Thread.Sleep(500); // Synchronous part
    await Task.Delay(500); // Asynchronous part
    return $"Time: {DateTime.Now:HH:mm:ss.fff}";
}

这段代码出现死锁。即使是单个未配置的顶级await如果您请求在外部库内部会导致死锁Result直接地,无需Task.Run.

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

Task.Run(async () => wait MethodAsync()).Result 和 MethodAsync().Result 之间有什么区别吗? [关闭] 的相关文章

随机推荐

  • Java InputStream 在线程中关闭

    我正在尝试从线程中的输入流读取 线程应该运行的类如下所示 static private class Runner implements Runnable private InputStream fis private OutputStrea
  • 通过 REST 工具测试 WebAuthn?

    是否可以通过休息工具在本地进行测试 我已经创建了后端来生成用于注册新信用的质询等 但是如果没有 WebAuthn 响应 如果我创建了正确的方法来消化来自 WebAuthn 的响应对象 我就会不知所措 如果您正在编写 FIDO2 WebAut
  • Eclipse JavaDoc 生成失败并出现 IllegalArgumentException?

    当我尝试为任何 javadoc 注释类导出或生成 javadoc 时 我总是收到错误 直到最近它才生成完全空的 html 文件 这是我之前收到的错误 Constructing Javadoc information Standard Doc
  • 如何使用 Material-UI ThemeProvider 和 createGenerateClassName 避免类名冲突

    想知道是否有人可以阐述如何避免这样一种情况 React 应用程序使用 makeStyles 中的material ui classNames 并且其中包含一个也执行此操作的包 因此有两个名称生成器 导致多个相互冲突的 jss1 jss2 等
  • 在 R/Tidyeval 中的 RHS 上使用类胶水结构

    我花了几个小时试图在公式的 RHS 上粘上胶水 但没有任何线索 这是一个简单的表示 meta lt function x var suffix x lt x gt mutate var suffix 5 x lt x gt mutate v
  • 复杂 JSON 对象的 C# 数据协定

    这可能是非常简单的事情 我到处寻找并尝试了我能想到的一切 因此 如果这是一个简单的搜索并且我只是在寻找错误的东西 我深表歉意 我对数据契约和 JSON 也很陌生 所以这可能并不是那么复杂 我正在创建一个 API 来摄取 JSON 并将其存储
  • UIScrollView滚动时如何向一个方向移动

    我是 Objective c 的新手 我创造UIScrollView对象并使用以下代码添加到我的视图中 height self view frame size height width self view frame size width
  • Woocommerce aJax 将优惠券代码应用到购物篮

    我试图在按下按钮时将优惠券代码应用到购物篮 我有以下代码 coupon jQuery this data coupon data coupon code coupon jQuery post wc ajax apply coupon cou
  • cin 还是 printf?

    在使用 c c 工作时 1 cin cout 或者 2 scanf printf 两者中哪一个的执行或运行时间会更少 或者两者都有相同的运行时间 我的目标是减少代码的运行时间 投注相对时间控制台IO功能是恕我直言 没有任何实际用途 这是完全
  • 在单个服务器上单独的 Git 部署

    我希望我的应用程序中有一个功能 允许用户在版本之间进行更改 特别是查看冲刺之间应用程序的差异 用户只需从下拉列表中选择一个版本 Sprint A Sprint B 等 页面就会刷新 显示当时应用程序的状态 这本身应该不是什么太大的问题 我认
  • 强大的哈希字符串函数并恢复它

    我正在寻找一个强大的哈希函数 算法 来对我的代码进行哈希处理 我想将散列字符串恢复为原始字符串 我可以恢复sha到原来的 你能帮助我吗 您无法从哈希恢复原始数据 因为它在设计上是不可逆的 通常的解释是鸽巢原理 大多数哈希值约为 128 25
  • 创建框架时 Xcode 8 中未找到 filename.h 文件错误

    我正在尝试使用以下步骤创建一个框架https www raywenderlich com 65964 create a framework for ios 我已将框架文件导入到项目中 我可以为框架文件创建对象并访问方法 但是当我构建项目时
  • Android - WebView 不播放 YouTube 视频

    我有一些 WebView 代码 我试图用它在 YouTube 频道上播放 YouTube 视频 但它所做的只是在视频上显示旋转图标 而从未真正启动视频 有人知道如何解决这个问题吗 public class YoutubeActivity e
  • PHP 回发 url 谷歌钱包 IAP

    我的谷歌钱包应用内支付的回发 php 如下所示
  • 使用数组参数调用本机函数

    我完全不知道如何使用数组参数调用本机 dll 中的函数 Example 该函数在 C 项目中定义为 DllImport Project2 dll SetLastError true CallingConvention CallingConv
  • 如何将对象注入 Ninject 模块

    我正在使用 Ninject 进行 DI 我有 Ninject 模块 它将一些服务绑定到内核 并使用其他模块中的绑定对象作为服务 为了弄清楚这种情况 让我们看几行代码 这是我的安全模块 它提供了一个名为PermissionManagerCon
  • 使用 NHibernate QueryOver 实现“不存在的地方”

    使用新的QueryOverNHibernate 中的 API 我需要做一些相当于 select c from Category c where not exists select from CategoryProduct cp where
  • 在 VS2010 中将 version=10.0.0.0 替换为 11.0.0.0 进行更改后出现新的构建错误

    我遇到了同样的问题构建错误 创建 Excel 2010 的 VSTO 插件 根据解决方案进行更改后 我得到了新的错误 The InitializeDefaultProperties task could not be loaded from
  • XmlSerializer 保存临时文件的最安全位置

    我注意到 XmlSerializer 需要使用磁盘空间来执行其命令 如果没有可写的 temp 文件夹 则会失败并出现如下错误 Source System Xml Message Unable to generate a temporary
  • Task.Run(async () => wait MethodAsync()).Result 和 MethodAsync().Result 之间有什么区别吗? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我需要实现一个不支持异步的第三方接口 特别是来自 automapper 的 IValueResolver 我想知道这两段代码有什么区别 使用第一个而不是第二个有什么优点吗 我将在