为所有服务器端代码调用ConfigureAwait 的最佳实践

2023-11-26

当你有服务器端代码(即一些ApiController)并且你的函数是异步的 - 所以它们返回Task<SomeObject>- 每当您等待调用的函数时,这是否被认为是最佳实践ConfigureAwait(false)?

我读到它的性能更高,因为它不必将线程上下文切换回原始线程上下文。然而,使用 ASP.NET Web Api,如果您的请求来自一个线程,并且您等待某个函数并调用ConfigureAwait(false)当您返回最终结果时,这可能会让您进入不同的线程ApiController功能。

我在下面输入了一个示例来说明我正在谈论的内容:

public class CustomerController : ApiController
{
    public async Task<Customer> Get(int id)
    {
        // you are on a particular thread here
        var customer = await GetCustomerAsync(id).ConfigureAwait(false);
        
        // now you are on a different thread!  will that cause problems?
        return customer;
    }
}

Update: ASP.NET Core 没有SynchronizationContext。如果您使用 ASP.NET Core,则是否使用并不重要ConfigureAwait(false) or not.

对于 ASP.NET“完整”或“经典”或其他任何内容,此答案的其余部分仍然适用。

原始帖子(针对非核心 ASP.NET):

ASP.NET 团队的这段视频提供了有关使用的最佳信息async在 ASP.NET 上。

我读到它的性能更高,因为它不必将线程上下文切换回原始线程上下文。

对于 UI 应用程序来说确实如此,其中只有一个您必须“同步”回的 UI 线程。

在 ASP.NET 中,情况有点复杂。当async方法恢复执行,它从 ASP.NET 线程池中获取一个线程。如果您使用禁用上下文捕获ConfigureAwait(false),那么线程就直接继续执行该方法。如果不禁用上下文捕获,那么线程将重新进入请求上下文,然后继续执行该方法。

So ConfigureAwait(false)不会为您节省 ASP.NET 中的线程跳转;它确实节省了您重新输入请求上下文的时间,但这通常非常快。ConfigureAwait(false) could如果您尝试对请求进行少量并行处理,那么 TPL 会很有用,但实际上 TPL 更适合大多数这些场景。

然而,对于 ASP.NET Web Api,如果您的请求在一个线程上传入,并且您等待某个函数并调用ConfigureAwait(false),那么当您返回 ApiController 函数的最终结果时,这可能会将您置于不同的线程上。

其实,只是做一个await可以做到这一点。一旦你的async方法命中await, the method被阻止,但thread返回到线程池。当该方法准备好继续时,将从线程池中抢夺任何线程并用于恢复该方法。

唯一的区别ConfigureAwaitASP.NET 中的关键在于线程在恢复方法时是否进入请求上下文。

我有更多背景信息MSDN 文章关于SynchronizationContext and my async介绍性博客文章.

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

为所有服务器端代码调用ConfigureAwait 的最佳实践 的相关文章

  • 从亚马逊 s3 流式传输文件

    我在尝试从 amazon s3 流式传输文件时遇到问题 基本上 我的文件存储在 amazom s3 上 我无法提供对这些文件的直接访问 因为用户需要进行身份验证 我正在尝试找到一种流式传输文件的方法 而无需将每个文件从亚马逊下载到我的服务器
  • IIS 中有 ASP.NET 网站管理工具吗?

    我正在使用 asp net 网站管理工具来管理项目中的不同角色 当前是客户和管理员 在vs 2008的开发过程中 管理角色非常容易 项目 gt Asp Net 配置 部署系统 IIS 时如何管理我的角色和用户 是否可以在 IIS 上运行 a
  • 为什么我们不在函数中通过引用传递 POD?

    我总是被告知我们不应该通过引用传递 POD 但最近我发现引用实际上根本不占用内存 那么为什么我们选择这样写 void DoSomething int iNumber 代替 void DoSomething const int riNumbe
  • Asp .Net Core 如何处理区域中的错误页面

    if env IsDevelopment app UseDeveloperExceptionPage else app UseExceptionHandler Administration Error app UseExceptionHan
  • PointToScreen 多个显示器

    我正在使用 PointToScreen 来确定弹出窗口的位置 以便它位于用于弹出窗口的按钮旁边 但是 该按钮位于工具栏上 因此用户可以移动弹出窗口 弹出窗口的位置效果很好 但如果用户位于象限上 我想将弹出窗口移动到底部上方 而不是下方 或左
  • 本地化 Win7 版本上的 UI 截断

    我有两个分别用 C NET 3 和 Wise Installer 开发的 UI UI 是向导页面 这在 Win 7 英文操作系统上完美运行 但是当我在Win7韩语或中文上部署该应用程序时 我看到了截断 即使我对字体进行硬编码 我也会看到这个
  • 使用 LINQ 计算两个字符串之间的匹配字符数

    一位朋友问我如何使用 LINQ 改进一些代码 如何在两个字符串之间进行逐字符比较以计算索引处的匹配数 这是原始代码 可以使用 LINQ 对其进行改进吗 private int Fitness string individual string
  • 使用 Visual Studio 确定堆栈空间

    我正在 Visual Studio 2005 中使用 C 进行编程 我有一个多线程程序 但这在这里并不是特别重要 如何确定 大约 我的线程使用了多少堆栈空间 我计划使用的技术是将堆栈内存设置为某个预定值 例如 0xDEADBEEF 长时间运
  • 近指针和远指针

    我们常用的指针 我们通常使用的指针 近指针和远指针之间有什么区别 近指针和远指针在当今的 C C 系统中是否有实际用途 任何需要使用这些特定指针而不是其他 c c 语义的实际场景都会非常有帮助 近和远关键字起源于英特尔之前的分段内存模型 近
  • 如何用C++读取UTF-8文件数据?

    我有一个清单IPA https en wikipedia org wiki International Phonetic Alphabet名为 ipa txt 的文本文件中的 UTF 8 符号并为其分配了数字 如何将它与源文件交叉引用 该源
  • 尝试更新 datagridview 时界面冻结

    我正在使用下面的代码复制文件并将状态列设置为datagridview通知用户连接已建立 但是当我按下按钮执行时 方法界面冻结 我已经搜索了很多我知道使用task run 不可能 因为它不包含在 not 4这是一个新功能 net 4 5我也知
  • 使用 std::chrono::high_resolution_clock 每秒写入一帧 30 次

    我正在使用 OpenCV 编写视频文件 为了cv VideoWriter为了正常工作 对 write 函数的调用必须每秒恰好发生 30 次 对于 30fps 的视频 我发现this https aaka sh patel 2013 06 2
  • DockPanel Suite - DockContent 可见性

    表单包含一个带有 DockContent 实例的 DockPanel 该实例具有 DockState DockState DockBottomAutoHide 并且它充当记录器视图 就像 Visual Studio 的错误列表面板 因此 当
  • 编译C代码字符串

    这里真的是一个离奇的问题 但是有没有一种方法可以在 GCC 中编译 C 代码字符串 而无需任何介质来保存该字符串 例如源文件 大致如下 gcc include
  • 在哪里可以找到好的 C++ 源代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在学习 C 作为第一语言 我觉得如果我不尽快开始查看实际代码 我的学习就会达到天花板 我不是通过课
  • 多次使用属性时的性能考虑

    我在用CultureInfo CurrentCulture当使用格式化我的字符串时string format 去引用这个博客 http goatly spaces live com Blog cns ED869F22AB5C24A8 171
  • 为什么 C# 和 Java 中出现“null”?

    我们注意到 用 C 或 Java 开发的软件中的许多错误都会导致 NullReferenceException 语言中包含 null 有什么原因吗 毕竟 如果没有 null 我就不会有 bug 对吧 换句话说 语言中的哪些功能如果没有 nu
  • 如何创建可插入的 ASP.Net 网站?

    创建网站并能够为其开发插件的最佳实践是什么 就像您想要创建一个博客模块 并且您希望用户或共同开发人员添加插件来扩展该模块的功能一样 Update 感谢您的超快答案 但我认为这对我来说太过分了 难道没有更简单的解决方案吗 就像我看到的blog
  • 使用 range-v3 读取以逗号分隔的数据行

    是的 因为我最近问了一个非常类似的问题 如何读取以逗号分隔的整数列表 但这次我被困在读取由逗号分隔数据组成的字符串行上 将我之前处理整数的代码转换为处理数据块字符串肯定很简单 对吧 好的 所以我从文件或标准输入中读取数据 该文件或标准输入有
  • 如何在 Application.Run(form1) 执行时隐藏 form1?

    我有一个运行的 form1Application Run 我想隐藏这个表单 我需要它隐藏 因为我在后台运行一些东西 所以它们必须执行 并打开另一个表单进行登录 我尝试的方法是在我的 form1 构造函数中执行命令this Hide 如果登录

随机推荐

  • 与普通指针相比,按值传递“unique_ptr”是否会降低性能?

    普遍的智慧是std unique ptr不会带来性能损失 不使用删除器参数时不会造成内存损失 但我最近偶然发现了一个讨论 表明它实际上引入了一个额外的间接 因为unique ptr无法在具有 Itanium ABI 的平台上的寄存器中传递
  • Google 登录失败(ApiException:8)

    当我尝试通过 google 登录时 出现此异常 2020 11 12 13 32 51 571 7351 7351 com test app W aaab com google android gms common api ApiExcep
  • 如何打印浮点数的每一位?

    我正在尝试在 C 中打印出浮点数的每一位 我可以用这个来处理整数 int bit return int a int loc Bit returned at location int buf a 1 lt
  • 在 Ubuntu 14.04 上升级 Cabal

    当我通过安装 Haskell GHC cabal 时sudo apt get我安装了 cabal 版本 1 16 这显然不是最新版本 我该如何升级到至少 1 18 版本 我尝试做sudo apt get update and sudo ap
  • 有额外的 while 循环条件...基于条件吗?

    变量a可以取任意数量的值 的价值a是 while 循环的额外预定义条件的数量 这可以通过多个来完成elif陈述 但有没有更干净的方法来做到这一点 if a 0 while condition 1 elif a 1 while conditi
  • JSF 使用 session.invalidate 注销不会清除当前用户名?

    在我的 JSF 应用程序中 我获取当前登录用户的名称 如下所示 public String getLoggedInUsername return FacesContext getCurrentInstance getExternalCont
  • Weinre 不工作,正在尝试调试?

    我想我可能遗漏了一些东西 但我已经使用脚本在我的 Android 平板电脑上安装了 apk 在标题中 我决定尝试在本地运行它http forums adobe com docs DOC 2623 我转到 localhost 8080 并安装
  • 如何在运行时克隆 Control 事件处理程序?

    我想复制一个控件 如按钮 文本框等 但我不知道如何复制事件处理程序方法 例如Click 到新的控件 我现在有以下代码 var btn2 new Button btn2 Text btn1 Text btn2 size btn1 size b
  • 如何在SASS中将字符串拆分为两个数字列表?

    我有一个 SASS SCSS 字符串 其中包含两个列表 以逗号分隔 每个列表都包含数字 以空格分隔 如何将字符串拆分为两个数字列表 SCSS values 10px 20px 30px 20px 30px 40px begin should
  • 如何通过对合并值求和来合并两个数组[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 如何对相同键的数组的值求和 我正在寻找一个array merge 函数不替换值 而是添加它们 例如 这是我正在尝试的代码 echo pre a1 array a gt 2 b gt 0 c g
  • 使用 Zend_Session::rememberMe 持久登录

    我在用着Zend Session管理我的用户会话 我希望在我的应用程序中实现 记住我 选项 以使用户登录状态持续两周左右 我注意到了Zend Session已经有一个名为的内置函数Zend Session rememberMe 但是我不确定
  • 在 App Engine 上使用 Spring AOP 会导致 StackOverflowError

    我们有一个在 App Engine 上运行并使用 Spring 框架的应用程序 最近我们添加了一些基于AOP的新功能 我们决定使用 AspectJ 风格 因此我们添加了
  • 有人可以帮我使用谷歌图表创建一个简单的垂直条形图吗?

    我需要帮助来构建动态图表 我有以下代码 但需要将其更改为垂直条形图而不是水平条形图 这里是示例 您可以将 bhs 更改为 bvs 并根据需要更改缩放比例 尝试这个
  • 如何避免多个
  • 产生双边框
  • 如何避免列表样式出现双边框线 请参阅下面的小提琴以获得清晰的图片 我想要每个盒子的宽度为 1px 但是当它们组合在一起时它们是双倍的 http jsfiddle net awaises 4SLPh 1 HTML ul li li li li
  • 在Java中提取int的数字

    因此 如果我输入一个整数 int num 1 128 我如何能够解析数字并获得 1 2 和 8 并将它们分配给不同的变量 Thanks 执行此操作的低效方法是将整数转换为字符串并迭代字符串字符 更有效的方法是这样的 int n 128 wh
  • Python 删除某些文件扩展名

    我对 Python 相当陌生 但我已经让这段代码可以工作 并且事实上 做了它想要做的事情 但是 我想知道是否有更有效的方法来编码 也许可以提高处理速度 import os glob def scandirs path for current
  • 浮点运算中什么是上溢和下溢

    我觉得我不太明白这个概念overflow and underflow 我问这个问题是为了澄清这一点 我需要从最基本的层面来理解它 让我们使用简化的浮点表示1 byte 1位符号 3位指数和4位尾数 0 000 0000 我们可以存储的最大指
  • iOS 8 Mapview 当前位置不火

    MKMapview当前用户位置未触发iOS 8 以前的iOS 7 iOS 6工作正常 self mapView delegate self self mapView showsUserLocation YES 在这一行中自动调用用户当前位置
  • 以编程方式打开“请勿打扰”

    在iOS 6中 您可以打开 关闭 请勿打扰模式 有可能通过应用程序做到这一点吗 或者至少有一种方法可以查明它是否已设置 我没有确切的答案 但我建议您研究 Apple 拥有的内部设置 URL prefs root 记录如下 http www
  • 为所有服务器端代码调用ConfigureAwait 的最佳实践

    当你有服务器端代码 即一些ApiController 并且你的函数是异步的 所以它们返回Task