async/await whenall 立即返回

2023-12-10

我有这个“简单”测试代码...(不要打扰类方法的奇怪使用...)

我正在努力抓住Task<>错综复杂...我想我有点了解Task<>.Start()/Task<>.Result模式(也许因为它更像“旧”Thread.Start()?)但是一旦我觉得抓住了一些东西(所以我就扔进去await关键字)...然后所有的东西再次纠缠在一起:-(

为什么我的代码在第一个任务完成后立即返回?为什么它不等待Task.WhenAll()?

static BigInteger Factorial(BigInteger factor)
{
    BigInteger factorial = 1;
    for (BigInteger i = 1; i <= factor; i++)
    {
        factorial *= i;
    }
    return factorial;
}

private class ChancesToWin
{
    private int _n, _r;

    public ChancesToWin(int n, int r)
    {
        _n = n;
        _r = r;
    }

    private Task<BigInteger> CalculateFactAsync(int value)
    {
        return Task.Factory.StartNew<BigInteger>(() => Factorial(value));
    }

    public async Task<BigInteger> getFactN()
    {
        BigInteger result = await CalculateFactAsync(_n);
        return result;
    }

    public async Task<BigInteger> getFactN_R()
    {
        BigInteger result = await CalculateFactAsync(_n - _r);
        return result;
    }

    public async Task<BigInteger> getFactR()
    {
        BigInteger result = await CalculateFactAsync(_r);
        return result;
    }

}

private async static void TaskBasedChancesToWin_UseClass()
{
    int n = 69000;
    int r = 600;

    List<Task<BigInteger>> tasks = new List<Task<BigInteger>>();

    ChancesToWin ctw = new ChancesToWin(n, r);

    tasks.Add(ctw.getFactN());
    tasks.Add(ctw.getFactN_R());
    tasks.Add(ctw.getFactR());

    // The getFactR() returns first of the other two tasks... and the code exit!
    BigInteger[] results = await Task.WhenAll(tasks);

    // I don't get here !!!!
    BigInteger chances = results[0] / results[1] * results[2];

    //Debug.WriteLine(chances);
}

static void Main(string[] args)
{
    TaskBasedChancesToWin_UseClass();
}

异步方法同步运行,直到第一次等待,此时它们将控制权返回给调用方法,通常返回一个代表异步操作其余部分的任务。TaskBasedChancesToWin_UseClass不返回任务,因此调用者无法等待它完成。这就是为什么你不应该使用async void在事件处理程序之外。

Since Main在操作有机会完成之前,不会等待您的应用程序结束。

你通常会等待await但自从你Main不能是可以同步阻止的异步方法Wait关于从返回的任务TaskBasedChancesToWin_UseClass:

async static Task TaskBasedChancesToWin_UseClass()
{
    // ...
}

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

async/await whenall 立即返回 的相关文章

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

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • 收到错误“无法添加已存在的实体”。将表的值插入数据库时​​无需过程

    我使用 Linq to sql 将记录列表插入到数据库表中 如下所示 my DataContext Class using VTMMedicalDBDataContext objVTMMedicalDBDataContext new VTM
  • Python IOError:Errno 13 权限被拒绝

    好吧 我完全困惑了 我整晚都在研究这个问题 但无法让它发挥作用 我有权查看该文件 我想做的就是阅读该死的东西 每次我尝试都会得到 Traceback most recent call last File
  • Xcode 6 对按钮图像的约束

    我正在创建一个应用程序 其仪表板包含 11 个图像 1 是背景 1 是分隔按钮的线 9 是带有图像的按钮 我尝试了几次自动约束分配 但我也尝试了手动 但我不知道如何正确设置约束 我也遵循了很多教程 如果您观看下图 您会发现按钮 图像尤其是
  • CouchDB + 凭据 + 原始通配符的 CORS 问题

    我正在尝试在 flow ch 上从 Cloudant 迁移到 Jelastic 在本地测试 离子服务 时 我收到 pouchdb 的 CORS 错误 除了我缺少的 CouchDB 之外 Jelastic 中还有其他配置吗 XMLHttpRe
  • numpy 获取许多样本而不按行替换

    我有一个非常大的清单 想象一下它看起来像这样 test llama cow horse fish sheep goat cat dog 我想多次从这个列表中抽样 我希望每个样品都被采集而不需要更换 在这种情况下我想避免 for 循环 我在
  • 使用sql计算之前的时间

    假设我有下表test它有列id time post这是它拥有的数据的样本 id time post 1 2018 06 17 16 12 30 post1 2 2018 06 17 16 13 09 post2 3 2017 06 15 1
  • 使用 gradle build 运行 tomcat jasper 任务 (jspc)

    我试图在 gradle 中使用 jspc 编译我们的 jsp 文件 但出现异常 这是相关的 gradle 部分 tomcatHome is defined in gradle properties ant tomcatHome tomcat
  • Facebook 无法在应用程序 swift 3 中打开页面

    我的网站上有一个指向我的 Facebook 的链接 该链接可在手机浏览器中打开 如果安装了应用程序 我希望它默认在 Facebook 应用程序中打开 我试图输入这段代码 但它不起作用 始终且仅通过 Safari 打开 Facebook 页面
  • 使用 SMTPLib Python 时获取未经授权的发件人地址

    我编写了一个非常简单的 Python 脚本来自动发送电子邮件 这是它的代码 import smtplib From email protected To email protected with smtplib SMTP smtp gmx
  • 测试 Hystrix 断路器配置

    我们的应用程序是通过使用 Hystrix 实现断路器模式以抗脆弱的方式编写的 整个应用程序是使用测试驱动实践创建的 但陷入了我们需要通过在方法上配置相同策略来实现断路器策略的阶段 以下是我们使用的示例配置 HystrixCommand co
  • X 轴和 Y 轴相交于 0 [重复]

    这个问题在这里已经有答案了 我使用以下代码来生成此图 x lt c 0 916 0 815 0 101 0 029 0 166 0 949 0 073 0 054 1 006 y lt c 3 91 5 17 1 08 1 28 1 01
  • LINQ Take() 反复返回相同的结果

    我想翻阅一些记录 但是Take 延伸自LINQ没有返回我预期的结果 public IQueryable
  • Grails Log4j DSL 配置中的 Log4j 过滤器

    有没有办法指定 log4j 过滤器Grails log4j DSL配置 我需要在 Grails log4j 配置中定义类似的内容
  • 如何防止 gdb 在下一个命令后停止

    我正在尝试定义一个命令链 该命令链将在 gdb 中的断点之后调用 break some function commands up next printf some string continue end 在这种情况下 例如 我想在 some
  • 将复选框添加到 PHP POST 电子邮件表单

    我正在尝试为 WordPress 构建一个表单 我过去使用过插件 但我需要对某些特定样式进行最大程度的控制 我还不太擅长 PHP 所以正在努力尝试向脚本添加复选框 我已经删除了我的尝试并将复选框留在了 html 中 但不在 PHP 中 有人
  • SQL命令插入中文字母

    我有一个数据库 其中有一列 nvarchar 类型 如果我写 INSERT INTO table VALUES 玄真 表明 在表中 我应该怎么办 我正在使用 SQL 开发人员 使用单引号而不是双引号来创建文本文字并用于NVARCHAR2 N
  • 在 for 循环中写入 .csv

    我想在 for 循环中写入 csv 文件 假设我有一个数据框data为了简单起见 有 3 行变量x 最后 我希望输出为 200 个 csv 文件 每个文件包含一行数据 数据的第一列是我的变量的标识 ID 此外 我的数据描述如下 data I
  • JavaScript通过数组中的循环设置时间差

    我尝试使用 JavaScript 中的循环将值存储在数组中 它只对我部分有效 我想将时间存储在数组中 会有startTime endTime和一个间隔 例如 如果想获取9 00到10 00之间的时间 间隔为15分钟 应该打印 09 00 0
  • Java:为什么大正数相乘会导致负结果? [复制]

    这个问题在这里已经有答案了 我看到一些用 Java 进行整数相乘的奇怪行为 我正在做一些编码练习 并发现了以下嘶嘶声类型的练习 要求 给定一个整数 编写一个函数 找出小于给定整数的每个 3 的倍数的乘积 except5 的任意倍数 例如 给
  • async/await whenall 立即返回

    我有这个 简单 测试代码 不要打扰类方法的奇怪使用 我正在努力抓住Task lt gt 错综复杂 我想我有点了解Task lt gt Start Task lt gt Result模式 也许因为它更像 旧 Thread Start 但是一旦