博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
阅读量:2288 次
发布时间:2019-05-09

本文共 1682 字,大约阅读时间需要 5 分钟。

来自: 

开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)的方式实现异步调用:

1: class Program
2: {
3:     static void Main(string[] args)
4:     {
5:          List
actions = new List
();
6:         actions.Add(() => Console.WriteLine("A1"));
7:         actions.Add(() => Console.WriteLine("A2"));
8:         actions.Add(() => Console.WriteLine("A3"));
9:         actions.Add(() => Console.WriteLine("A4"));
10:
11:         foreach (var action in actions)
12:         {
13:             ThreadPool.QueueUserWorkItem(state => action(), null);
14:         }
15:
16:         Console.Read();
17:     }
18: }

但是出现错误的输出结果:

解决的方案就是在每次For循环中,调用Thread.Sleep休眠当前线程,哪怕是1ms:

1: class Program
2: {
3:     static void Main(string[] args)
4:     {
5:          List
actions = new List
();
6:         actions.Add(() => Console.WriteLine("A1"));
7:         actions.Add(() => Console.WriteLine("A2"));
8:         actions.Add(() => Console.WriteLine("A3"));
9:         actions.Add(() => Console.WriteLine("A4"));
10:
11:         foreach (var action in actions)
12:         {
13:             ThreadPool.QueueUserWorkItem(state => action(), null);
14:
15:             Thread.Sleep(1);
16:         }
17:
18:         Console.Read();
19:     }
20: }
21:

这次能够输出正确的结果:

我们也看到很多人确实是这么做的。但是如果真是必须这样的话,这样的编程方式很难让我接受,不知道大家有何高见。

在老赵的提示下,醒悟过来:由于被置于ThreadPool中的操作时异步的,还没有来的执行的时候,action已经被for循环改变,永远是同一个action对象! 呵呵,脑袋有时候有点转不过弯!

所以正确的写法是:

1: foreach (var action in actions)
2: {
3: var a = action;
4: ThreadPool.QueueUserWorkItem(state => a(), null);
5: }

作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

你可能感兴趣的文章
机器学习_算法_KNN
查看>>
Deep Learning_main
查看>>
Deep Learning_mnist background introduction
查看>>
linux_shell_util
查看>>
Project manage_maven3安装,配置
查看>>
linux_ramdisk妙用
查看>>
project manage_maven_android
查看>>
Foreign Language_english_补语
查看>>
Foreign Language_english_感叹句
查看>>
Foreign Language_english_限定词
查看>>
Foreign Language_english_人称代词&数词
查看>>
Foreign Language_english_从句
查看>>
Foreign Language_english_副词和形容词区别
查看>>
Foreign Language_english_语法分析_1
查看>>
Machine Learning_mahout_20news_caution
查看>>
R_bioinfomatics_heatmap
查看>>
8086_proteus_masm配置
查看>>
8086_proteus_all_dsn
查看>>
Other_2015 规划
查看>>
Music_stories_index
查看>>