C#ThreadPool.QueueUserWorkItem实例「建议收藏」

C#ThreadPool.QueueUserWorkItem实例「建议收藏」今天学习线程池的时候发现,网上能搜到的都是很久以前的文档了,大家都是照搬过去,有没有考证都是问题。经过测试结果已经和他们说的不一样了,比如 Listactions=newList(){()=>{Console.WriteLine(“A-1”);},()=>{Conso

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

今天学习线程池的时候发现,网上能搜到的都是很久以前的文档了,大家都是照搬过去,有没有考证都是问题。

经过测试结果已经和他们说的不一样了,比如

<span style="white-space:pre">	</span>    List<Action> actions = new List<Action>()
            {
                () => { Console.WriteLine("A-1"); },
                () => { Console.WriteLine("A-2"); },
                () => { Console.WriteLine("A-3"); },
                () => { Console.WriteLine("A-4"); }
            };
            foreach (var action in actions)
            {
                ThreadPool.QueueUserWorkItem(state => action(), null);
                
            }

输出的结果网上流传的是

A-4

A-4

A-4

A-4

大概就这个了

现在我用VS2012运行后的结果已经不是这样的了,虽然顺序每次都不一样,但是4个结果都会输出

A-2

A-3

A-1

A-4

大概这个一样的。

同样的代码,出现不同的结果,应该是foreach底层代码不同的原因,还没有去考证。

当然,如果我们用for循环的话,结果就又不一样了

比如写成

 for (int i = 0; i < actions.Count; i++)
 {
    ThreadPool.QueueUserWorkItem(state => actions[i](), null);
 }

大概很多人觉得没问题,其实会出现超出索引的错误,原因是开启线程池需要时间,还没有开启成功的时候 for循环已经执行完了,这个时候,开启的线程池又去调用索引i指向的函数,而for循环执行完以后,i的最后值为4,不是3.所以超出索引。

写成

for (int i = 0; i < actions.Count-1; i++)
 {
        ThreadPool.QueueUserWorkItem(state => actions[i](), null);
 }

执行后的结果是

C#ThreadPool.QueueUserWorkItem实例「建议收藏」

如果想要4个函数按顺序执行,一种可以在主线程中等待一段时间在执行下一个,第二中可以通过ThreadPool.SetMaxThreads 和ThreadPoolMinThreads,控制线程池中线程的可执行的线程个数来实现。不知道这样做是否合理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189953.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • centos防火墙配置「建议收藏」

    centos防火墙配置「建议收藏」centos防火墙配置1.centos中firewalld与iptablescentos7以前的版本默认使用iptables服务进行管理防火墙规则。centos7以及其以上版本默认使用firewalld服务管理防火墙。所以在centos8中,就使用其默认的firewalld配置防火墙。2.firewalld相关命令进程与状态相关systemctlstartfirewalld.service#启动防火墙systemctlstopfirewalld.servic

    2022年6月26日
    27
  • Postman使用教程详解「建议收藏」

    Postman使用教程详解「建议收藏」目录1、Postman安装与接口请求基本操作1.1Postman安装1.2发起一个接口请求的小测试2、接口测试实战2.1百度IP查询接口从抓包到测试实战2.2需要设置头域的请求实战2.3文件上传与json请求实战1、Postman安装与接口请求基本操作1.1Postman安装Postman下载网址:https://www.postman.com/downloads/安装好的界面长这样:1.2发起一个接口请求的小测试开发的天气API接口地址:https://tianqiapi.com/ind

    2022年5月31日
    36
  • js中settimeout和setInterval区别_JavaScript set

    js中settimeout和setInterval区别_JavaScript setsetTimeout描述setTimeout(code,millisec)setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式。注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止参数描述code必需,要调用的函数后要执行的JavaScript代码串。millisec必需,在执行代码前需等待的毫秒数。setTimeintervalsetIn…

    2022年10月4日
    3
  • 手机号验证最新正则表达式「建议收藏」

    一般表单页面都需要填写手机号,校验用户输入的手机号码是否正确,就要用到正则表达式,用正则表达式来匹配手机号段,如在运营商号段内,则号码正确。因此,需要知道运营商最新的号段,如下所示:各大运营商手机号码段(新)中国电信号段133、153、173、177、180、181、189、190、191、193、199中国联通号段130、131、132、145、155、156、166、167、171、175、176、185、186、196中国移动号段134(0-8)、135、136、137、138

    2022年4月5日
    159
  • java 异常分类和处理机制

    java 异常分类和处理机制一、背景介绍程序在运行过程中发生错误或异常情况是不可避免的,如果每一个运行时错误都由程序员手动控制和处理,其工作量是不可想象的。Java语言中的异常处理机制就解决的上述问题,把错误与异常的管理带到了面向对象的世界Java语言定义了很多异常类,将运行错误和异常的信息和处理方法封装在了异常类中,帮助程序员检查和控制异常。即J…

    2022年5月13日
    47
  • windows10+nvidia驱动+cuda10.1+cudnn安装教程

    windows10+nvidia驱动+cuda10.1+cudnn安装教程一、显卡驱动提前安装好nvidia驱动,windows一般都自动安装了nvidia驱动了没有安装驱动可以去官网下载驱动https://www.geforce.cn/drivers选择自己对应的显卡驱动,默认安装就可以了。下载之前查看自己显卡驱动和cuda版本号之间的关系,如下图所示,然后进行选择性安装。https://docs.nvidia.com/cuda/cuda-to…

    2022年5月24日
    158

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号