Task.Wait 不等待异步方法完成

2023-11-30

这是代码:

static async Task Main(string[] args)
{
    var t = new Task(async () => await AsyncTest());
    t.Start();
    t.Wait();
    Console.WriteLine("Main finished");
}

private static async Task AsyncTest()
{
    Thread.Sleep(2000);
    await Task.Delay(2000);
    Console.WriteLine("Method finished");
}

我的期望是t.Wait()实际上会等待AsyncTest方法完成和输出将是:

Method finished 
Main finished

实际上输出只有Main finished。 Wait() 在您点击的那一刻完成await Task.Delay(2000)在 AsyncTest 中。如果你替换也会发生同样的情况t.Wait() with await t / await Task.WhenAll(t) / Task.WaitAll(t).

解决方案是将方法重写为同步实现或直接在AsyncTest()上调用Wait()。然而,问题是为什么它会以如此奇怪的方式工作?

附:这是代码的简化版本。我试图实现延迟任务执行。实际上,任务对象是由程序的一个部分创建的,然后在某些特定条件后由另一部分执行。

UPD:重写 vart = new Task(async () => await AsyncTest()) to var t = new Task(()=> AsyncTest().Wait())也解决了这个问题。虽然我仍然不太明白为什么 Task 不能与委托内部的 async/await 一起正常工作。


我仍然不太明白为什么任务不能与委托内部的 async/await 一起正常工作。

因为Task构造函数仅用于创建委派任务- 即代表要运行的同步代码的任务。由于代码是同步的,您的asynclambda 被视为async void拉姆达,这意味着Task实例不会异步等待AsyncTest去完成。

更重要的是,the Task构造函数永远不应该以任何理由在任何代码中、任何地方使用。它的有效用例实际上为零。

一个很好的替代品Task.Task is Task.Run, which does理解async拉姆达。

在我的真实程序中,任务已延迟执行。任务对象在一个地方创建,然后在特定条件后由程序的另一部分执行。

在这种情况下,请使用异步委托。具体来说,Func<Task>.

static async Task Main(string[] args)
{
    Func<Task> func = AsyncTest;

    // Later, when we're ready to run.
    await func();
    Console.WriteLine("Main finished");
}

private static async Task AsyncTest()
{
    Thread.Sleep(2000);
    await Task.Delay(2000);
    Console.WriteLine("Method finished");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Task.Wait 不等待异步方法完成 的相关文章

  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N

随机推荐

  • 突出显示输入字段中的文本

    我正在尝试在 JS 中创建一个脚本 突出显示用户输入的某些文本 有点像来自的 测试字符串 框 https regex101 com 但似乎无法在使用时更改输入字段本身内的文本 有谁知道我该怎么做 无法设置内容的样式input字段 或text
  • 我怎样才能将双标参数折叠成空?

    在方法调用中对空数组进行 Splat 扩展 可以有效地将参数减少为空 为了清楚起见 添加了空括号 def foo end def bar args foo args end bar 1 ArgumentError as expected b
  • C++ 中的动态对象?

    我意识到我很可能会得到很多 你不应该这样做 因为 的答案 他们是最受欢迎的 我可能会完全同意你的推理 但我很好奇这是否是可能的 正如我所设想的那样 是否可以在 C 中定义一种动态 通用对象类型 在其中我可以动态创建在系统的键 值类型中存储和
  • 如何判断屏保正在运行?

    人们可能建议的一种解决方案是定期查找特殊的 屏幕保护程序 桌面 如果存在 则将其视为正在运行的屏幕保护程序 但显然并非所有屏幕保护程序都是如此 因为某些提到的桌面始终存在 有没有更可靠的解决方案 请参阅带有 SPI GETSCREENSAV
  • 在开玩笑的测试中,shallow 抛出意外的 token < 错误

    我目前正在使用以下堆栈设置单元测试 React v15 组件是用 typescript tsx 编写的 测试设置是使用 jest v21 和酶 v3 完成的 测试文件被编写为普通的 js 文件 不幸的是 酶似乎出了问题 因为我不断收到错误
  • 淘汰赛绑定不会使用简单可观察值数组进行更新

    我的视图模型中有一个字符串列表 要编辑它们 我希望每个都显示为 li 带有一个文本框和一个 li
  • python pandas 3个最小值和3个最大值

    如何在 pandas 数据框中的列中找到 3 个最小值和 3 个最大值的索引 我找到了找到最大值和最小值的方法 但没有找到找到 3 的方法 你尝试了什么 你可以排序s sort 然后打电话s head 3 index and s tail
  • 如何存储配置文件并使用 React 读取它

    我是 React js 的新手 我已经实现了一个组件 在该组件中我从服务器获取数据并使用它 如下所示 CallEnterprise function TenantId fetchData http xxx xxx xx xx 8090 En
  • 使用控制器之间的共享服务进行脏检查,一种方法有效,另一种则无效?

    在尝试回答有关在两个单独的控制器之间共享数据的问题时 我遇到了一个问题 我通常使用服务来完成此任务并开始创建 jsfiddle 但我无法让它工作 经过一番调试后 如果我在中动态创建属性setActivePersonWorks person
  • Android,快速有效地查找目录大小的方法?

    在我的应用程序中 我想找到许多目录的大小 并且需要它快速运行 我见过这些方法 其中两个不够快 第三个仅适用于Java 不适用于Android First public static long folderSize File director
  • codeigniter 301 使用旧 url 的路由器进行重定向,并且不保留重定向

    我有一个 codeigniter 网站 我正在为其做 SEO 所以问题是大多数 url 都缓存在搜索引擎中 我的旧 url 是 product details productname productid 我的新网址将是 tours city
  • 无法解析:com.google.firebase:firebase-auth:9.0.0 [重复]

    这个问题在这里已经有答案了 As per Firebase Android 代码实验室教程 同时添加com google firebase firebase auth 9 0 0在 build gradle 依赖项中 出现以下错误 错误 2
  • JS 对象字面量中的“类似方法”语法是什么[重复]

    这个问题在这里已经有答案了 使用ES6类糖 我们可以这样定义函数 class Foo constructor props myFn 在 JS 对象字面量中 我们可以定义getters and setters像这样 foo get data
  • 在 App.xaml 上添加 BasedOn 样式会在 App() { InitializeComponent(); 上崩溃}

    使项目适应模板10 我进入 App xaml 中的继承样式崩溃了 看起来像模板10 不支持继承或扩展样式 我试图延长字幕样式 from 标题样式但我收到 COM 异常获取Xaml类型 in XamlTypeInfo g cs 我的应用程序
  • TeamCity - Microsoft.Bcl.Build 依赖项

    我刚刚突然向我的存储库提交了一些代码更改 在几周的良好状态之后 TC 构建开始失败 因为无法下载 Microsoft Bcl Build 1 0 6 的 NuGet 包 我最终不得不手动将包目录的内容复制到 TC 构建位置 这完全违背了 N
  • “Prism-ES2 错误:GL_VERSION (major.minor) = 1.4”的原因可能是什么?

    我正在尝试使用 eclipse IDE 在 Oracle Linux 中开发简单的 javafx 程序 我已经安装了 jdk 7 并且所有程序都运行正常 除了它显示 Prism ES2 Error GL VERSION major mino
  • Unity无法设置ActiveScene

    我正在切换场景 SceneManager LoadScene Scene2 Debug Log Current scene SceneManager GetActiveScene name 调试说 Current scene Scene1
  • 不使用 As 的条件类型

    我有一个名为movies可以采用定义为以下接口的两种形状的形式 interface BaseMovie id number title string interface MultiSearchResult extends BaseMovie
  • 使用 ggplot2 从两个不同的数据帧创建密度图

    我的目标是比较多年来收入等各种社会经济因素的分布 以了解特定地区的人口在五年内的变化情况 这方面的主要数据来自于公共使用微观数据样本 我在用R ggplot2作为我的首选工具 在比较两年的数据 2005 年和 2010 年 时 我有两个数据
  • Task.Wait 不等待异步方法完成

    这是代码 static async Task Main string args var t new Task async gt await AsyncTest t Start t Wait Console WriteLine Main fi