这是 async-await 如何工作的正确图表吗?

2023-12-13

我将尝试就以下问题发表演讲async-await我正在创建一个流程图,试图显示可能的执行顺序。

enter image description here

我试图根据这些段落来确定这一点

异步方法的开头就像任何其他方法一样执行 方法。也就是说,它同步运行,直到遇到“等待”(或 抛出异常)。

“await”关键字是异步的地方。等待的是 就像一元运算符:它需要一个参数,一个可等待的(一个 “awaitable”是一个异步操作)。等待检查 等待查看它是否已经完成;如果可等待的有 已经完成,那么该方法就继续运行 (同步,就像常规方法一样)。

如果“await”发现等待尚未完成,那么它会采取行动 异步地。它告诉等待者运行剩余的部分 方法完成后,然后从异步方法返回。

稍后,当等待完成时,它将执行剩余部分 的异步方法。如果您正在等待内置的可等待对象(例如 一个任务),那么异步方法的其余部分将在 在“await”返回之前捕获的“context”。

from http://blog.stephencleary.com/2012/02/async-and-await.html


usr 的答案基本上是正确的,尽管我认为它在线程和任务之间进行了过于强烈的类比。任务不必与另一个线程类似。请记住,线程是工作者,任务是工作。您可以在待办事项清单上列出一百件事,而无需雇用任何工人来完成它们。尽量不要将任务视为轻量级工作人员,因为事实并非如此。它们是需要完成的工作;工作人员做什么取决于交给你任务的代码。

你的图表一开始很好,但在“调用者是否完成了所有独立工作?”时就偏离了轨道。调用者的延续是,不管它是什么。如果这种延续涉及到工作,那么它确实有效。其中一些工作可能是安排任务在当前线程上运行。其中一些工作可能是保持 UI 的响应能力。

另外,不要忘记调用者的线程可能会终止,并且任务的继续可以安排到另一个线程。

这里可能发生很多很多事情;如果不了解调用者到底在做什么以及调用者的线程上下文是什么,就不可能说出等待返回后立即发生的情况。

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

这是 async-await 如何工作的正确图表吗? 的相关文章

  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 使用 Visual Studio Express 2010 表单应用程序进行 C++ 多线程处理

    我正在开发一个 Windows 窗体应用程序 它连接到一个硬件 获取大量数据 1 GSample 秒 对其进行处理 然后单击按钮将其输出到屏幕上 我现在尝试在一个可以随时启动 停止的循环中自动化该过程 以便我可以在调整采集硬件的输入的同时对
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 英文日期差异

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

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • 非常简单的 C# CSV 阅读器

    我想从 CSV 文件创建一个数组 这就像您想象的一样简单 CSV 文件只有一行和这些值 Device SignalStrength Location Time Age 我想将这些值放入一维数组中 我尝试了一些示例 但它们都比所需的更复杂 您
  • 列出当前进程中的所有线程?

    我正在尝试实现一个系统调用 它允许我获取当前进程的线程数 我是Linux内核的新手 所以我对它的理解很有限 目前 我正在尝试迭代所有task structs 并将它们的线程组领导者的PID与当前线程组领导者的PID进行比较 int nthr
  • 如何获取JFrame中的所有元素?

    我有这段代码来获取我需要的所有元素并进行一些处理 问题是我需要指定每个面板 我必须获取其中的元素 for Component c panCrawling getComponents processing for Component c pa
  • 如何将导航道具从父组件传递到标头?

    我有 4 个页面 App js HomeScreen js Login js Toolbar js 我的应用程序页面与 StackNavigator import React Component from react import Plat
  • UITableView滑动删除不确认

    关于 UITableView 中滑动删除功能的快速问题 有没有办法直接删除行而不显示 删除 按钮并等待用户确认 实现您的自定义 UITableViewCell 并利用UISwipe手势识别器 您必须自己编写所有逻辑 协议 委托等 但您将可以
  • 簇块异常

    我使用清晰的语言来构建我的聊天机器人 https github com samtecspg 铰接 当我执行时出现以下错误docker compose up api 1 api 1 usr src app server index js 33
  • 断言错误:302!= 200

    我尝试在我的tests py中创建一个测试 class TaskViewTests TestCase def test task view with no task self If no task exist an appropriate
  • SQL Server 2008 中的小时和分钟总和

    我写了一个查询 但它没有给出正确的答案 我想像这样显示 5小时58分钟 7小时58分钟 13小时56分钟 答案应该13 56 但是下面的查询给出15 09 请回复我任何其他解决方案 这里Effort1是 5 小时专栏 Effort1Minu
  • 基于列名称模式的多个成对差异

    我有一个data table dt dt Id v1 v2 v3 x1 x2 x3 1 7 1 3 5 6 8 2 1 3 5 6 8 5 3 3 5 6 8 5 1 v1 v2 v3 和 x1 x2 x3 是数值变量 我想从 v 列中减去
  • Flutter 的 pubspec.yaml 中依赖版本号之前的插入符号 (^) 是什么?

    In the pubspec yaml我的 Flutter 项目的文件中有一个插入符号 位于某些依赖项的版本号之前 dependencies flutter sdk flutter cupertino icons 0 1 2 english
  • JavaScript 中的 new String("x") 有什么意义?

    有哪些用例new String already a string 它的全部意义是什么 实际用途很少String创建的对象new String foo 唯一的优点是String对象比原始字符串值更重要的是 作为一个对象 它可以存储属性 var
  • 中的“status”有什么作用?

    我正在使用以下命令来显示 userList 中的值
  • 如何验证使用 Struts2 JSON 插件发送的 JSON 而不引发异常

    假设有一个Double操作中的变量 并且如果请求正文中发送的值类似于 dblField and the interceptorStack好像
  • 将十六进制转换为 RGBA

    我的小提琴 http jsbin com pitu 1 edit 我想尝试一个简单的十六进制到 RGBA 的转换 我使用过的浏览器默认使用 rgb 渲染颜色 因此当使用 farbtastic 颜色选择器时 我通过抓取十六进制值生成的背景颜色
  • 使用 RegEx(notepad++) 删除重复的字符串/单词(不是行)

    我想知道一种使用 notepad 正则表达式查找工具删除文本文件 而不是行 中重复单词或字符串的方法 我只看到了使用 TextFx 删除重复行的方法 但这不是我想要的 例子 123 789 123 321 删除 123 将导致 123 78
  • 如何在webrtc中的canvas流上添加音频流

    我想将通过 getusermedia 获得的音频流添加到画布流并将其发送到远程对等点 于是我抬头一看 有addTrack 但addTrack 似乎不能正常工作 我在 chrome 上运行 var audioTracks navigator
  • 每像素碰撞 - 代码解释

    我目前正在尝试了解每像素碰撞检测 这是我不明白的代码 static bool IntersectPixels Rectangle rectangleA Color dataA Rectangle rectangleB Color dataB
  • Microsoft Office Excel 无法访问文件“c:\inetpub\wwwroot\Timesheet\App_Data\Template.xlsx”

    我的代码如下 Microsoft Office Interop Excel Application oXL null Microsoft Office Interop Excel Sheets sheets Application exce
  • 奇数按降序排列,偶数按升序排列

    给定一个随机整数数组 将奇数元素按降序排序 偶数元素按升序排序 输入示例 1 4 5 2 3 6 7 Output 7 5 3 1 2 4 6 针对时间复杂度进行优化 它是哪种语言 C 或 C 我看到两个标签 在 C 中 您可以使用std
  • 这是 async-await 如何工作的正确图表吗?

    我将尝试就以下问题发表演讲async await我正在创建一个流程图 试图显示可能的执行顺序 我试图根据这些段落来确定这一点 异步方法的开头就像任何其他方法一样执行 方法 也就是说 它同步运行 直到遇到 等待 或 抛出异常 await 关键