我是否应该始终在 ASP.NET Core API 控制器中使用 async/await [重复]

2024-03-04

作为一个例子,我有一个ASP.NET Core API controller从服务中获取一些数据并2实现控制器方法的可能方法:

使用异步/等待:

[HttpGet]
public async Task<IActionResult> GetSomeDataAsync()
{
   return await someService.GetSomeDataAsync();
}

没有异步/等待:

[HttpGet]
public Task<IActionResult> GetSomeDataAsync()
{
   return someService.GetSomeDataAsync();
}

这两个哪个更好?这里的关键是只有 1 次调用另一个异步方法(someService.GetSomeDataAsync()).


根据ASP.NET Core 性能最佳实践 https://learn.microsoft.com/en-us/aspnet/core/performance/performance-best-practices?view=aspnetcore-3.1来自 ASP.NET 团队:

避免阻塞呼叫

ASP.NET Core 应用程序应设计为同时处理许多请求。异步 API 允许一小群线程通过不等待阻塞调用来处理数千个并发请求。该线程可以处理另一个请求,而不是等待长时间运行的同步任务完成。

ASP.NET Core 应用程序中的一个常见性能问题是阻塞异步调用。许多同步阻塞调用会导致线程池饥饿和响应时间降低。

  • Do make 热代码路径 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/best-practices?view=aspnetcore-3.1#understand-hot-code-paths异步。
  • 如果异步 API 可用,请异步调用数据访问、I/O 和长时间运行的操作 API。
  • 不使用任务.运行() https://www.ben-morris.com/why-you-shouldnt-create-asynchronous-wrappers-with-task-run/使同步 API 变为异步。
  • 务必使控制器/Razor 页面操作异步。整个调用堆栈是异步的,以便受益异步/等待 https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/async-scenarios模式。

避免在 HttpRequest/HttpResponse body 上同步读取或写入

ASP.NET Core 中的所有 I/O 都是异步的。服务器实现 Stream 接口,该接口具有同步和异步重载。应优先选择异步以避免阻塞线程池线程。阻塞线程可能会导致线程池饥饿。

优先选择 ReadFormAsync 而不是 Request.Form

Use HttpContext.Request.ReadFormAsync代替HttpContext.Request.Form. HttpContext.Request.Form满足以下条件时可以安全地只读:

  • 该表格已通过致电读取ReadFormAsync, and
  • 正在使用读取缓存的表单值HttpContext.Request.Form

优化数据访问和 I/O

与数据存储和其他远程服务的交互通常是 ASP.NET Core 应用程序中最慢的部分。高效地读取和写入数据对于良好的性能至关重要。

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

我是否应该始终在 ASP.NET Core API 控制器中使用 async/await [重复] 的相关文章

  • WebClient.DownloadDataAsync 冻结了我的 UI

    我在 Form 构造函数中的 InitializeComponent 之后有以下代码 using WebClient client new WebClient client DownloadDataCompleted new Downloa
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • ASP.Net Core SAML 身份验证

    我正在尝试将 SAML 2 0 身份验证添加到 ASP Net Core 解决方案 我找不到有关该主题的任何文档 因此我不确定从哪里开始 那里可能有文档 但我不想花三天时间成为这方面的专家 据我所知 ASP Net Core 对旧的 OWI
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • 在 Android 1.5 上运行应用程序时出现 NotFoundException 和 FileNotFoundException

    我正在尝试将 android 1 6 应用程序向后移植到 android 1 5 遵循此处的建议 http comments gmane org gmane comp handhelds android devel 97051 http c
  • Python Matlab 引擎安装

    我一直在尝试为 python 安装 matlab 引擎 这样我就可以从 python 脚本中调用 matlab 函数 我使用的指南是这个 http uk mathworks com help matlab matlab external i
  • 如何以编程方式删除 UINavigationbar 提示?

    我有一个视图控制器 我在IB中设置了带提示的导航栏 但有时我想删除提示并将栏设为 1 行 我怎样才能在代码中做到这一点 self navigationItem setPrompt nil 这会以动画方式删除提示
  • Webpack 动态 require 和 require 语句中的加载器

    是否可以使用动态require and require context在 require 语句中使用显式加载器 我希望能够做这样的事情 但这对我不起作用 var req require context somedir false js va
  • 如何在 linq 中使用 groupby 时进行多重连接

    我的数据库中有一个图片评级表 对于每个新的评级 都会创建一个新的图片评级表行 我将按上周和图片 ID 对这些评分进行分组 这意味着上周一张图片的所有评分将被累积并成为一个评分 然后我将能够按其计数对它们进行排序 这是我的图片评级表 publ
  • 如何在 celery 内为每个用户生成队列?

    因此 我尝试将 Web 请求中的阻塞内容移至后台任务并利用队列 我对消息传递和发布 订阅也很陌生 用户将数据推送到那里并进行处理 稍后用户会收到相关通知 我为此做了一个 celery 设置 发现它不能满足我为每个用户分配自己的任务的专用队列
  • Android 和设置(图像)视图 alpha 的 alpha

    真的没有对应的 XML 属性吗 setAlpha int 如果没有 还有哪些替代方案 它比其他响应更容易 有一个xml值alpha需要双值 android alpha 0 0 那是看不见的 android alpha 0 5 透视 andr
  • Rails 5.2 中单独的secret_key_base?

    我刚刚从 5 1 升级到 5 2 我对这种 更好 的存储秘密的方法感到很困惑 也许我不明白 但现在开发和生产似乎已经 合并 成一个单一的SECRET KEY BASE也master key 它是否正确 如果没有 我如何使用单独的主密钥和SE
  • 使用 Firebase-PHP 验证 Firebase ID 令牌

    我正在使用 Firebase Auth 在以 PHP 编码的网络应用程序上授权用户 授权本身是用 Javascript 进行的 它在 Ajax 请求上执行以验证用户是否已登录 要在我已经实现的服务器上使用 Firebase AdminFir
  • 当我单击屏幕上的其他位置时,按钮的底部边框消失

    fiddle https jsfiddle net bbvxnsyo 这是我的 HTML 代码
  • 基于偏好的分组算法

    我正在寻找一种方法来根据偏好将人们分类 例如 假设有 100 名学生 每人将被分配到以下五个班级之一 科学 40 个座位 数学 15 个席位 历史 15 个席位 电脑 20 个座位 写作 10 个座位 每个学生都有三个按偏好排序的首选课程
  • 为 std::shared_ptr 分配内存的正确方法

    我已经实现了一个功能 其中身份被赋予给我并且不受我的控制 它返回std shared ptr
  • 使用 GraphQL 机制,但返回 CSV

    普通的 REST API 可能会让您以不同的格式请求相同的数据 并使用不同的Accept标头 例如application json or text html or a text csv格式化的响应 但是 如果您使用 GraphQL 则 JS
  • OpenGL ES 1.1:如何在不损失亮度的情况下更改纹理颜色?

    我希望能够在代码中更改粒子的颜色 因此可以使用任何颜色 所以我只有一种基本上具有亮度的纹理 我一直在使用glColor4f 1f 0f 0f 1f 应用颜色 我尝试过的每个 Blendfunc 都接近工作 最终都像下面的最后一张图片一样 我
  • 向下滚动到div+一定的边距

    我正在使用此脚本滚动到页面上的某个 div button click function html body animate scrollTop scrolltothis offset top 500 工作完美 这会将页面滚动到 scroll
  • Unix C 套接字服务器不接受连接

    事情是这样的 我正在用 C 语言 使用 unix 系统调用 编写一个简单的 tcp 套接字服务器 但我无法接受连接 据我所知 我很好地完成了服务器初始化 但是当我尝试连接到我打印出来的端口 参见下面的代码 时 它拒绝了 就好像什么都没有一样
  • CKEDITOR:如何转换所有 html 实体

    这是清单 http www elizabethcastro com html extras entities html http www elizabethcastro com html extras entities html我要么想启用
  • 运行混淆代码时是否会影响性能? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 All 我建议在我的组织的标准构建过程中添加代码混淆 人们提出的问题之一是 与运行未混淆的代码相比 运行混淆的代码是否会对性能产生影响
  • C#:使用 Winforms 关闭 SerialPort 的正确方法

    我有一个应用程序 我可以从串行端口读取数据 一切正常 直到我关闭该应用程序 当我单击 X 时 应用程序只是挂起 UI 无响应 我从 DataReceived 事件处理程序中的端口读取数据 并在 FormClosed 发生时关闭端口 priv
  • 我是否应该始终在 ASP.NET Core API 控制器中使用 async/await [重复]

    这个问题在这里已经有答案了 作为一个例子 我有一个ASP NET Core API controller从服务中获取一些数据并2实现控制器方法的可能方法 使用异步 等待 HttpGet public async Task