理解一行中使用 Task.Run + Wait() + async + wait 的用法

2024-06-23

我是 C# 新手,所以我很难理解一些概念,并且遇到了一段我不太理解的代码:

static void Main(string[] args)
{
 Task.Run(async () => { await SomeClass.Initiate(new Configuration()); }).Wait();
 while (true) ;
}

据我了解,这运行一个启动方法的任务。该方法运行,然后,一旦完成,它就会进入无限循环等待。感觉要么是代码没有意义,要么是我理解不对。


您可以将其分为几个部分:

async () => { await SomeClass.Initiate(new Configuration()); }

是一个 lambda 表达式,定义async只是等待另一个方法的方法。然后这个 lambda 被传递给Task.Run:

Task.Run(async () => { await SomeClass.Initiate(new Configuration()); })

Task.Run在线程池线程上执行其代码。以便asynclambda 将在线程池线程上运行。Task.Run返回一个Task这代表着执行async拉姆达。打电话后Task.Run,代码调用Task.Wait:

Task.Run(async () => { await SomeClass.Initiate(new Configuration()); }).Wait();

这将阻塞主控制台应用程序,直到异步 lambda 完全完成。

如果你想进一步了解它是如何分解的,下面的内容大致相同:

static async Task AnonymousMethodAsync()
{
  await SomeClass.Initiate(new Configuration());
}

static void Main(string[] args)
{
  var task = Task.Run(() => AnonymousMethodAsync());
  task.Wait();
  while (true) ;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解一行中使用 Task.Run + Wait() + async + wait 的用法 的相关文章

  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • 如何通过 Excel 互操作对象自动调整列大小?

    下面是我用来将数据加载到 Excel 工作表中的代码 但我希望在加载数据后自动调整列的大小 有谁知道自动调整列大小的最佳方法 using Microsoft Office Interop public class ExportReport
  • 将 R 值传递给采用 L 值的函数时出现过载歧义

    我有 2 个重载函数 一个采用 L 值 另一个采用 R 值 目的是让该函数可以像这样调用 Obj obj foo obj OR foo Obj 所以 我写了2个重载函数 template
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与
  • 表单头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++

    我之前关于同一项目的问题 one https stackoverflow com questions 15758851 unresolved external sybol in referenced library visual c and
  • std::thread <未解析的重载函数类型> 错误

    我试图从我的类中生成一个线程 并且该线程在我的类中执行特定的方法 代码如下所示 class ThreadClass int myThread int arg do something void createThread thread t t
  • 如何将值插入DataGridView单元格?

    I have DataGridView 持有任何DataBase 我想将任何值插入到任何单元格中 并且该值将保存在数据库上 如何做到这一点 在 C 中 提前致谢 您可以按如下方式访问任何 DGV 单元 dataGridView1 Rows
  • 获取 C# 字符串的非第一个段的快速而巧妙的方法

    I do a split 在一个字符串上 我想拉出返回字符串的第一个元素以获得字符串的其余部分 f e THIS IS AN AMAZING STRING split 我想要得到除了这个之外的所有单词 这是 是一根神奇的绳子 该字符串在第一
  • 无需 Excel 和 OLEDB 即可读取 .xlsx

    是否有机会在 C 中读取 xlsx 文件 而无需在客户端上安装 Excel 并且没有可用的 OLEDB 连接 该应用程序是一个用 VS2005 C NET Framework 2 0 编写的 Winforms 项目 这里的这个怎么样 EPP
  • GSL 中的错误 - 根查找

    大家好 我在让我的程序与 GSL 根查找一起工作时遇到问题 我正在尝试找到我的方程的解 我正在寻找 64 行数据的解决方案 但在某些特定行中 程序无法继续 可能是因为不存在好的解决方案 但我希望程序在找不到解决方案时跳过行 但我的程序有时会
  • 如何在 C# 中创建唯一的随机字符序列?

    我正在我的应用程序中实现 URL 缩短功能 以便为我的用户提供可在 Twitter 中使用的更短的替代 URL 关键是要独立于提供相同服务的缩短服务 并将其作为我的网络应用程序的一项功能 创建约 6 个字符的独特随机字符序列的最佳方法是什么
  • 使用 MEF 从 shell 加载棱镜模块视图

    我有一个 shell 项目 它将引导程序中的模块加载到 shell 主视图中的选项卡控件中 我刚刚在选项卡项上实现了一个关闭按钮 现在提出了如何从 shell 重新加载模块视图的问题 尝试使用 moduleManager LoadModul
  • 获取 Qt 对象的大小

    我正在使用 Qt 和 C 我需要找出某些 Qt 类的实例使用的内存量 这通常是使用 sizeof 完成的 但是在 Qt 中 每个类都保存一个指向包含实际实现的另一个类的指针 此私有实现类的定义在标头中找不到 而仅在源代码中找到 我是 Qt
  • 代码分析警告 CA2213 - 在 IDisposable 支持字段上调用 ​​Dispose()

    想要发布这个 尽管我在写问题时就弄清楚了 下面将发布答案 使用 VS Code Analysis 收到以下警告 警告 CA2213 DBConn 包含 IDisposable 类型的字段 DBConn k BackingField SqlC
  • 使用 std::chrono::high_resolution_clock 每秒写入一帧 30 次

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

随机推荐