为什么我要费心使用 Task.ConfigureAwait(continueOnCapturedContext: false);

2023-11-23

考虑以下 Windows 窗体代码:

private async void UpdateUIControlClicked(object sender, EventArgs e)
{
    this.txtUIControl.Text = "I will be updated after await - i hope!";
    await Task.Delay(5000).ConfigureAwait(continueOnCapturedContext: false);
    this.txtUIControl.Text = "I am updated now.";
}

这里在第 3 行抛出异常,因为在等待之后代码​​在非 UI 线程上执行。 ConfigureAwait(false) 在哪里有用?


Stephen Cleary 在这方面有一个非常好的系列,你可以在这里找到,我引用了针对您的问题的那篇文章:

大多数时候,你不need同步回“主”上下文。大多数异步方法在设计时都会考虑到组合:它们等待其他操作,并且每个方法本身都代表一个异步操作(可以由其他操作组合)。在这种情况下,你想告诉服务员not通过调用捕获当前上下文配置等待并经过false, e.g.:

private async Task DownloadFileAsync(string fileName)
{
  // Use HttpClient or whatever to download the file contents.
  var fileContents = await DownloadFileContentsAsync(fileName).ConfigureAwait(false);

  // Note that because of the ConfigureAwait(false), we are not on the original context here.
  // Instead, we're running on the thread pool.

  // Write the file contents out to a disk file.
  await WriteToDiskAsync(fileName, fileContents).ConfigureAwait(false);

  // The second call to ConfigureAwait(false) is not *required*, but it is Good Practice.
}

// WinForms example (it works exactly the same for WPF).
private async void DownloadFileButton_Click(object sender, EventArgs e)
{
  // Since we asynchronously wait, the UI thread is not blocked by the file download.
  await DownloadFileAsync(fileNameTextBox.Text);

  // Since we resume on the UI context, we can directly access UI elements.
  resultTextBox.Text = "File downloaded!";
}

此示例中需要注意的重要一点是,异步方法调用的每个“级别”都有其自己的上下文。DownloadFileButton_Click在 UI 上下文中启动,并调用DownloadFileAsync. DownloadFileAsync也是在 UI 上下文中启动,但随后通过调用退出其上下文ConfigureAwait(false)。其余的DownloadFileAsync在线程池上下文中运行。然而,当DownloadFileAsync完成并且DownloadFileButton_点击简历,就可以了does在 UI 上下文中恢复。

一个好的经验法则是使用ConfigureAwait(false)除非你认识你do需要上下文。

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

为什么我要费心使用 Task.ConfigureAwait(continueOnCapturedContext: false); 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 实现一个方法,将块用作回调

    我想写一个类似的方法 void myMethodWithView UIView exampleView completion void BOOL finished completion 我基本上已经剥离了从 Apple 的类方法之一中获取的
  • 如何从身份验证代理后面运行 svcutil.exe

    我想运行svcutil exe用于访问 Internet 上的 Web 服务的工具 不幸的是 每当我尝试时 我都会收到一堆错误 其中包括以下消息 请求失败 HTTP 状态为 407 需要代理身份验证 ISA 服务器需要授权才能完成请求 对
  • 在 Flex/Actionscript 中编码 HTML

    有没有可以转换的函数 Me Myself I to Me Myself amp I 我在 Flex 文档中找不到任何内容 Thanks Check this出去 没有要包括的 SWC 基本上是 var s String new XMLNod
  • primefaces 中 richfaces 组件的替代方案

    我目前正在尝试将项目从 RichFaces 3 0 迁移到 PrimeFaces 6 0 但我没有在 PrimeFaces 中找到类似的组件 a4j 区域 丰富 组件控件 rich hash参数 Follow Richfaces 到 Pri
  • ORA-27101: 共享内存领域不存在

    当我启动oracle时 我遇到了这个错误 我检查了 Oracle Home 和 SID 一切都设置正确 ORA 27101 共享内存领域不存在 请帮我找出解决方案 提前致谢 该错误通常意味着没有可连接的 Oracle 实例 进程 需要有人登
  • 如何在 IntelliJ IDEA 中复制 JSON 中的路径?

    是否可以复制 JSON 文件中的路径 例如在这个文件中 a b c keyC 当我在 keyC 我会按一些热键 我会得到一个a b c剪贴板中的字符串 我知道这篇文章很旧 但我想我会给出更新的答案 我遇到这个问题是因为我正在寻找同样的东西
  • Apple 的 APNS 传输有时很慢

    使用我们自己的内置 APNS 推送系统 用 PHP 编写 我们可以在某些事件上推送到我们的设备 设备会立即收到某些通知 而某些设备可能需要长达 15 分钟才能看到 我们保持连接打开 按照 Apple 的要求 并根据记录的错误重置连接 通常是
  • 使用 sc.textFile() 加载本地文件到 Spark

    Question 如何使用 sc textFile 将文件从本地文件系统加载到 Spark 我需要改变什么吗 env变量 另外 当我在未安装 Hadoop 的 Windows 上尝试相同的操作时 我遇到了相同的错误 Code gt val
  • 需要Windows CE 5.0模拟器

    我需要一个 Windows CE 5 0 模拟器来测试我正在开发的嵌入式设备 不是 PDA 或智能手机 应用程序 这是我已经尝试过的 Visual Studio 2008 Pro 包含一个模拟器 不幸的是 它不包括 Windows CE 映
  • 将 Delphi 应用程序转换为作为服务运行 - 有必要吗?

    我有一个 delphi 应用程序 它记录来自不同位置的数据并将数据写入文件 该应用程序有一个相当广泛的 GUI 可以显示数据 配置选项等 一位用户请求将该应用程序更改为可以作为服务运行 他的理由是 该应用程序可以在启动时启动并在没有任何用户
  • 如何在 MVC 视图中显示对象列表?

    我有一个返回字符串列表的方法 我只是想在视图中以纯文本形式显示该列表 这是来自控制器的列表 public class ServiceController Controller public string Service Some code
  • Flutter resizeToAvoidBottomInset true 不适用于 Expanded ListView

    键盘隐藏了我的ListView 分组列表视图 我认为这是因为Expanded Widget My body Column children Expanded child Padding padding const EdgeInsets al
  • 如何打印_r $_POST 数组?

    我有下表
  • mysql 左外连接

    我有两张桌子 employee包含字段employee id 名字 中间名 姓氏 timecard包含字段employee id 入职时间 超时 tc date transaction 我想选择具有与考勤卡相同的employee id 且日
  • 在 PostgreSQL 中生成两个日期之间的时间序列

    我有一个这样的查询 可以很好地生成两个给定日期之间的一系列日期 select date 2004 03 07 j i as AllDate from generate series 0 extract doy from date 2004
  • 如何使用 Google Test 捕获分段错误?

    如何测试函数不会产生分段错误 这是我现在所知道的 我可以做的 EXPECT DEATH foo nullParameter 在函数内部 会产生分段错误 这是我想要失败的行为 上面的代码片段将使测试通过 因为这是预期的 进程的死亡 现在 我怎
  • 打包 APK 时出现错误:: 重复文件

    安卓工作室 我在应用程序运行期间遇到此类错误 Error Execution failed for task app packageDebug Duplicate files copied in APK META INF notice tx
  • SSRS 格式显示为百分比

    我已经在这里举了很多例子 如果我问重复的问题 我很抱歉 据我所知 我不是 我制作了一份 SSRS 报告 显示了我们销售部门某些方面的总销售额 它们按行细分 按 成本 毛利润 毛利润百分比 订单数 总销售额 这些栏目是我们销售的方面 网络销售
  • Android 处理程序定期

    这是我想要实现的目标 活动开始时没有 ClickListener 并且有四个文本视图 全部为白色背景 我想将 textview 1 的颜色更改为蓝色 等待 2 秒 然后将其改回白色 并将 textview 2 更改为蓝色 等待 2 秒 然后
  • 为什么我要费心使用 Task.ConfigureAwait(continueOnCapturedContext: false);

    考虑以下 Windows 窗体代码 private async void UpdateUIControlClicked object sender EventArgs e this txtUIControl Text I will be u