在控制台或 Web 应用程序中使用 async/await

2024-05-01

据我了解,async/awaitC# 中的功能将之间的段分开await每个等待的方法在单独的工作线程上返回后,调用在调用线程上运行的回调方法。调用线程在等待期间是“空闲”的。必须通过某种事件循环在调用线程上安排回调。

此事件循环仅存在于 Windows 窗体或 WPF 等 GUI 应用程序中。释放此循环可确保 UI 在长时间操作期间保持对其他用户交互的响应。

控制台应用程序和 Web 应用程序 (ASP.NET) 没有此类事件循环,因此此回调机制不起作用。但话又说回来,他们没有事件循环,因为他们不需要事件循环。没有用户在任何时候尝试与正在运行的程序交互,期望立即得到反馈。因此无需为此释放调用线程。无论该操作使用多少个线程,它只会在最后一位完成后返回。

那么有什么用async and await在控制台和 Web 应用程序中,或者一般的任何类型的非交互式代码中,例如 Windows 服务?与简单的同步调用相比,它有何不同或更高效?

我正在设计一个供 GUI 和非交互式(服务和 Web)程序使用的 API,但很难理解它在非 GUI 环境中的行为方式。


async-await 的要点是调用线程是always当您到达第一个异步点(即第一个await未完成的任务)。

在 UI 应用程序中,您有一个SynchronizationContext它将等待后的代码发布到 UI 线程,因为与 UI 交互的代码必须由 UI 线程执行,否则您将收到异常。您可以通过使用来控制ConfigureAwait(false).

在控制台应用程序(和服务等)中没有这样的需要,因此代码可以在某些ThreadPool线。调用线程(也可能是ThreadPool线程)被释放,并且能够同时执行其他类型的工作,而不是同步阻塞。因此,async-await 提高了可扩展性,因为它可以使用相同数量的线程完成更多工作。

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

在控制台或 Web 应用程序中使用 async/await 的相关文章

  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 使用 Visual Studio Express 2010 表单应用程序进行 C++ 多线程处理

    我正在开发一个 Windows 窗体应用程序 它连接到一个硬件 获取大量数据 1 GSample 秒 对其进行处理 然后单击按钮将其输出到屏幕上 我现在尝试在一个可以随时启动 停止的循环中自动化该过程 以便我可以在调整采集硬件的输入的同时对
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 更改 Windows Phone 8.1 的 Xamarin Forms 中 Picker 控件的默认文本颜色

    我正在使用 Xamarin Forms 选择器控件并需要设置文本颜色 但是没有这样的属性 我尝试制作一个自定义渲染器 它在 android 和 ios 中对我有用 我最终重新绘制了控件 在wp8 1平台中没有Draw事件并且渲染器中的控件本
  • 强制 telnet 客户端进入字符模式

    我有一个应用程序 我接受来自 telnet 客户端的套接字连接 并建立一个简单的键盘驱动的字符 GUI telnet 客户端 至少在 Linux 上 默认为一次一行模式 所以我总是必须这样做 mode char手动 浏览相关 RFC 表明
  • 部分类型作为模板参数 c++ [重复]

    这个问题在这里已经有答案了 简单地说 我可以通过吗std vector作为模板参数 以下示例列出用法 tempate
  • 从 contenteditable div 获取价值

    到目前为止 我一直使用文本区域作为表单的主要输入 我已将其更改为使用contenteditablediv 因为我想允许一些格式 以前 当我有文本区域时 可以使用 Ajax 和 PHP 很好地提交表单 现在我已经将其更改为使用 content
  • 如何更改 apache poi 生成的图表,使其不使用平滑线并将空单元格显示为间隙?

    我正在使用 POI 3 12 beta1 并拥有可创建包含多个数据集和图例中命名系列的折线图的代码 但是 poi 中折线图的默认设置会生成一条已在数据点上平滑的线 空值也被绘制为 0 但我们希望线条停在有空单元格的第一列 在 xlsx 文件
  • 在透明背景的按钮上剪出一块边框

    您好 我想弄清楚如何创建以下按钮 制作按钮很容易 但棘手的部分是在右侧创建小切口 该按钮具有透明背景 因此我无法将带有背景颜色的伪元素粘贴在那里以与其重叠 有任何想法吗 HTML div a view profile a div CSS d
  • C# 中的 IApplicationActivationManager::ActivateApplication?

    我正在致力于 Metro 应用程序的自动化测试 我发现代码可以完成我需要的很多工作 但它是用 C 编写的 http blogs msdn com b windowsappdev archive 2012 09 04 automating t
  • Express 申请中未处理的拒绝

    我的 Express 应用程序中运行着许多基于 ES6 Promise 的代码 如果有一个错误从未被捕获 我将使用以下代码来处理它 process on unhandledRejection function reason p consol
  • 在打字稿中扩展material-ui组件

    尝试扩展 Material ui Button 组件以添加新的道具 目的是添加一个新的 prop fontSize其中有三个选项 small medium large
  • 有没有 CakePHP 离线手册

    曾经有过 但似乎没有任何直接联系 经过一番挖掘 发现了一些答案 我认为分享这些答案会很有用 这些是一页中的手册链接 对于离线使用很有用 使用 Dardo Sordi Bogado 的构建脚本或创建 PDF 1 2 一页手册https web
  • 基于视图的 NSTableView 在插入带有动画的新行后渲染空白行

    我有一个基于视图的NSTableView我用 NSMutableArray 来支持 我定期出去获取一些数据 并希望将新行插入到顶部的表中 当我在没有指定动画的情况下执行此操作时insertRowsAtIndexes withAnimatio
  • Rails 使用驼峰命名法渲染 json 对象

    我在简单的 Rails API 中有以下控制器代码 class Api V1 AccountsController lt ApplicationController def index render json Account all end
  • JPA 与 Hibernate.initialize 等效的命令

    我有一个惰性集合 我想在我的服务 控制器中随意初始化它 此时我能做的就是 Hibernate initialize myEntity getListOfThings 该命令依赖于 hibernate 并且不会使 JPA 的实现变得透明 JP
  • 在 Visual Studio 中使用 Saxon .NET XSLT 处理器无法与智能感知配合使用

    我正在使用开源撒克逊 XSLT 处理器 http saxon sourceforge net 让 NET 执行一些 2 0 转换 我像引用任何其他 dll 一样引用 saxon9api dll 并且可以针对它编译代码 然而 Visual S
  • 如何从 WSL2 上的 ubuntu shell 设置 JAVA_HOME?

    我在 Windows 10 家庭版上安装了 WSL2 我想使用 Maven 我验证它在 Windows 上安装正确 在 Windows 终端的 ubuntu shell 中 我在我的 profile但它不会被设置 我运行这些命令来尝试设置
  • PHP imap_search:Microsoft Exchange 邮件服务器上的 UTF-8/非 ASCII 字符

    我想从以下位置获取电子邮件outlook office365 com使用 IMAP 和 PHP 由于大多数电子邮件包含非 ASCII 字符 例如 I use UTF 8 in my imap search 功能 imap search mb
  • 开发 Java 交易应用程序:是否存在用于定义交易规则的模式/框架?

    我正在设计一个交易应用程序 该应用程序将使用市场的 API 在市场上下订单 这不是投资银行中那种复杂的高性能算法交易应用程序 这只是一个小型个人应用程序 根据市场状况 趋势 每天可能会进行两到三次交易该应用程序将 大致 包含以下模块 包 策
  • 类与枚举类作为索引类型

    P0138R2 proposal http www open std org jtc1 sc22 wg21 docs papers 2016 p0138r2 pdf begins with1 有一种非常有用的技术可以引入一种新的整数类型 该
  • 恢复对 ember 数据模型的更改

    有没有办法轻松恢复对 Ember 数据模型的更改 我有一个绑定到编辑视图的模型 此视图使用户能够取消编辑 此时我想恢复对模型的更改 有没有一种简单的方法可以做到这一点 而无需克隆所有值 从 Ember Data 版本 2 开始 不再有交易
  • 在控制台或 Web 应用程序中使用 async/await

    据我了解 async awaitC 中的功能将之间的段分开await每个等待的方法在单独的工作线程上返回后 调用在调用线程上运行的回调方法 调用线程在等待期间是 空闲 的 必须通过某种事件循环在调用线程上安排回调 此事件循环仅存在于 Win