Task.ContinueWith 没有按照我的预期工作

2024-04-05

考虑以下代码。我从一个不执行任何操作的任务开始,然后使用ContinueWith() 启动对递增计数器的方法的10 次调用。

当我运行这个程序时,它打印“0”,表明increment()方法根本没有被调用。我预计它会被调用 10 次,因为这就是我调用ContinueWith() 的次数。

如果我取消注释“Thread.Sleep(20)”行,那么它会按预期打印“10”。

这种情况发生在发布或调试模式下。我的系统是一个具有超线程(8 个逻辑核心)的 2 核四核系统,运行 Windows 7 x64。

我认为我对 Task.ContinueWith() 的工作原理有某种根本性的误解......

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main()
        {
            using (var task = Task.Factory.StartNew(()=>{}))
            {
                for (int i = 0; i < 10; ++i)
                {
                    task.ContinueWith(_=> increment());
                    // Thread.Sleep(20);  // Uncomment to print 10 instead of 0.
                }

                task.Wait();
            }

            // This prints 0 UNLESS you uncomment the sleep above.
            Console.WriteLine(counter); 
        }

        static void increment()
        {
            Interlocked.Increment(ref counter);
        }

        private static int counter;
    }
}

任何人都可以阐明这里发生的事情吗?


原因很简单:您等待已经完成的任务。您真正想要的是等待您在循环中创建的十个任务:

var tasks = new List<Task>();
for (int i = 0; i < 10; ++i)
{
    tasks.Add(task.ContinueWith(_=> increment()));
}

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

Task.ContinueWith 没有按照我的预期工作 的相关文章

  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

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

随机推荐

  • GWT 同步调用

    我在 GWT 中有一个方法 它使用请求的 fire 方法从数据库检索数据 因为你们都知道它是异步的 我从 JS 调用这个方法 所以我需要同步是否可能 private static String retriveLocation String
  • docker 镜像与 docker-desktop for windows 一起存储在哪里?

    I installed docker desktop for windows 10 from https www docker com products docker desktop https www docker com product
  • 备份远程SQL Server数据库到本地

    我正在尝试将实时数据库备份到我的计算机上 但找不到执行此操作的选项 我使用 Microsoft SQL Server Management Studio 2008 R2 连接到它 我是 MySQL 猴子 所以我习惯了能够备份到 sql文件并
  • 对象 TextField 内的模板标签

    我需要里面的自定义模板标签model TextField价值 对象文本字段中的值类似于 lorem ipsum dolor mytag 但 mytag 不会呈现为模板标签 它在库中注册为标签并加载到页面上 我有 object textfie
  • 在 Java 中用货币符号解析价格

    我想将我拥有的字符串解析为数字 这是我正在使用但不起作用的代码 NumberFormat getCurrencyInstance Locale GERMAN parse EUR 0 00 这会导致 java text ParseExcept
  • 百分号 (%) 在 Objective C 中的数学作用是什么?

    我非常困惑百分号在 Objective C 中的作用 有人能用像我这样的普通白痴能理解的语言向我解释吗 谢谢 是模运算符 因此例如 10 3 将得到 1 如果你有一些数字a and b a b只给你剩下的a除以b 所以在例子中10 3 10
  • 如何判断当前TD是否是TR中最后一个TD

    我有单行和多行 td 就在里面 在我的一个职能中 我遇到了一种情况 我必须找出我的currentSelectedTD是最后一个 td 放在行中 以便我可以以不同的方式对待它 I tried currentSelectedTD is last
  • Html 文本悬停在每个单词上进行翻译

    您好 我有一个 HTML 页面 其中包含文本正文 我希望能够将鼠标悬停在文本中的单词上 然后一小朵云显示文本中该单词的翻译 知道我该怎么做吗 我将提供我需要知道哪种是在悬停时将每个单词从文本中分离出来的最佳方法 并使用单词或翻译列表进行检查
  • 如何在 ConstraintLayout 中显示 GoogleMap?

    我创建了一个新项目 MapsActivity 我从 Google 获取了 API 密钥 并将 API 密钥放置在 YOUR KEY HERE 区域内的 google maps API xml debug 中 我在 AndroidManife
  • 泛型方法的可重用非泛型方法

    我有以下基本界面 public interface IHandler void Handle IMessage message 以及继承基接口的通用接口 public interface IHandler
  • 基于 OpenID 的 SSO 和 WSO2 身份服务器

    无法使用 WSO2 身份服务器获得基于 OpenID 的 SSO 我关注了 Suresh Aththanayaka 给出的博客文章 但是进入后https localhost 9443 openid admin作为您的 OpenID 标识符
  • PHP 类中的错误处理

    嘿 这里有个问题要问你们 我有很多次为 PHP 中的类选择错误处理 例如 在 Ajax PHP 处理类中 我这样做 public function setError msg this gt errors msg public functio
  • ASP.net 必需字段验证器 VisualStudio 2012

    我正在使用 ASP net c 开发一个项目 我希望RequiredFieldValidator 检查我的文本框 我正在添加验证器 它在 Visual Studio 2010 中工作得很好 但是一旦我做了同样的事情 完全相同的事情 它就无法
  • 整数比较值的输出错误

    我有以下代码 public static void doIntCompareProcess int a 100 int b 100 Integer c 200 Integer d 200 int f 20000 int e 20000 Sy
  • 如何创建波浪形状 CSS?

    请参阅下图了解我正在尝试创建的内容 到目前为止 我有以下内容 但它需要更加 频繁 例如增加正弦波或余弦波的频率 wave position relative height 70px width 600px background e0efe3
  • SwiftUI 可从 NavigationView 向下搜索多个视图?

    我遇到了相关问题 searchable我想知道它是否与我的应用程序的视图层次结构有关 我可以找到的使用 Searchable 的示例说直接在 NavigationView 上使用它 并像这样显示它 var body some View Na
  • 如何对 React 组件的 shouldComponentUpdate 方法进行单元测试

    我有一个 React 组件 它实现了应该组件更新 https facebook github io react docs react component html shouldcomponentupdate方法 我想对其进行单元测试 理想情
  • Vapor 3 - 如何在保存对象之前检查类似的电子邮件

    我想创建一条路线来让用户更新他们的数据 例如更改他们的电子邮件或用户名 为了确保用户不能使用与其他用户相同的用户名 我想检查数据库中是否已存在具有相同用户名的用户 我已经使用户名在迁移中唯一 我有一个如下所示的用户模型 struct Use
  • Three.jsmaterialLoader不加载嵌入的纹理图像

    我使用 Material toJSON 提供的方法导出 Three js 材质 结果如下 metadata version 4 5 type Material generator Material toJSON uuid 8E6F9A32
  • Task.ContinueWith 没有按照我的预期工作

    考虑以下代码 我从一个不执行任何操作的任务开始 然后使用ContinueWith 启动对递增计数器的方法的10 次调用 当我运行这个程序时 它打印 0 表明increment 方法根本没有被调用 我预计它会被调用 10 次 因为这就是我调用