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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 以太坊钱包开发「建议收藏」

    以太坊钱包开发「建议收藏」目前的公链项目,影响力最大的应该就数以太坊和比特币了,其他的多数公链,基本上都是借鉴了以太坊和比特币公链项目而设计开发的。了解区块链的人都知道,比特币和以太坊这两个公链项目的差距还是挺大的,故而他们的钱包开发也是特别不一样的。本章我们将详细讲解以太坊钱包原理和开发流程,涉及到的内容有以下这些:依托钱包节点方式开发钱包,但这种方式的缺点就keystore生成存放到区块的节点上;非确定性以…

    2022年8月30日
    4
  • typedef struct Lnode{ Elemtype data; struct Lnode *next; } Lnode,*Linklist;「建议收藏」

    typedef struct Lnode{ Elemtype data; struct Lnode *next; } Lnode,*Linklist;「建议收藏」*next是指向下一个值的地址而*Linklist是当前这个值的地址,只是这个值里有数据data,和下一个值的地址就是说链表中,因为数据是随机储存的,所以地址不是连续的,要想读取下一个数,就要知道下一个数据的地址不知道有没有看懂,表达能力不是很好*Linklist相当于一个数组头指针,只是这个数组的元素是结构体*next则是构成链表的一个基本元素,指向该结点下一个结点的地址从某种意义上讲,*Linklist是指定了这段空间在内存中的位置(可以申请连续的结点空间),而*next则对结点进行了一

    2022年5月19日
    41
  • JS ajax 例子「建议收藏」

    JS ajax 例子「建议收藏」用js,jQuery编写ajax的样式,三种写法,例子://用js原生写法functionsendGet(url){xhr.onreadystatechange=function(){ if(xhr.readyState==4&&xhr.status==200){ //获取服务器响应 document…

    2022年7月13日
    15
  • ArcGIS转换坐标系_不同坐标系之间的转换

    ArcGIS转换坐标系_不同坐标系之间的转换ArcGIS 基础8-坐标系转换

    2022年4月20日
    71
  • Visual Studio 2013 各个版本的产品密钥[通俗易懂]

    Visual Studio 2013 各个版本的产品密钥[通俗易懂]win7/win8/win10系统下VisualStudio2013各个版本的密钥:VisualStudioUltimate2013KEY:BWG7X-J98B3-W34RT-33B3R-JVYW9VisualStudioPremium2013KEY:FBJVC-3CMTX-D8DVP-RTQCT-92494VisualStudioProfessional20…

    2022年5月12日
    56
  • 微软对ice服务器被炸的态度,我的世界ice服务器火了是因为被炸吗?「建议收藏」

    微软对ice服务器被炸的态度,我的世界ice服务器火了是因为被炸吗?「建议收藏」我的世界ice服务器被炸了这事情在2020年被炒的火热。本来服务器被炸是正常不过的事情了,但是不知道那个玩家在网上说什么ICE服务器价值好几万,炸服务器的玩家应该承担法律责任。而另一方面,炸服务器的凶手“Mn搜索阿喵”也自称服务器被炸之后它日子不好过。然而戏剧性的一幕发生了,3月29号,ICE服务器官方发表声明,说这一切都是造谣而已,所谓的ICE服务器价值没有好几万,服务器也才开了不到两个月。而…

    2022年5月1日
    83

发表回复

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

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