在控制台或 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 的相关文章

  • SQL 查询将文本数据存储在 Varbinary(max) 中

    有没有办法让 varbinary 在 SQL Server 中接受文本数据 这是我的情况 我有相当大量的 XML 我计划以 压缩 格式存储它们 这意味着 Varbinary 但是 当我进行调试时 我希望能够翻转配置开关并以纯文本形式存储 以
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 我需要安装什么才能获取 Microsoft.TeamFoundation.WorkItemTracking.Client.dll?

    我只需要安装VS2010 SDK http www microsoft com downloads en details aspx FamilyID 47305cf4 2bea 43c0 91cd 1b853602dcc5 是否有 TFS2
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • java中使用多线程调用同一类的不同方法

    我有一个类 如下所示 具有三种方法 public class MyRunnable implements Runnable Override public void run what code need to write here to c
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • Unity,c++ 本机插件字节数组不匹配

    在我的 C 本机插件中 我有一个调用 vector
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • 更改 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