难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
2009-05-22 09:31
603 查看
开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)的方式实现异步调用:
但是出现错误的输出结果:
解决的方案就是在每次For循环中,调用Thread.Sleep休眠当前线程,哪怕是1ms:
这次能够输出正确的结果:
我们也看到很多人确实是这么做的。但是如果真是必须这样的话,这样的编程方式很难让我接受,不知道大家有何高见。
在老赵的提示下,醒悟过来:由于被置于ThreadPool中的操作时异步的,还没有来的执行的时候,action已经被for循环改变,永远是同一个action对象! 呵呵,脑袋有时候有点转不过弯!
所以正确的写法是:
class Program { static void Main(string[] args) { List<Action> actions = new List<Action>(); actions.Add(() => Console.WriteLine("A1")); actions.Add(() => Console.WriteLine("A2")); actions.Add(() => Console.WriteLine("A3")); actions.Add(() => Console.WriteLine("A4")); foreach (var action in actions) { ThreadPool.QueueUserWorkItem(state => action(), null); } Console.Read(); } }
但是出现错误的输出结果:
解决的方案就是在每次For循环中,调用Thread.Sleep休眠当前线程,哪怕是1ms:
class Program { static void Main(string[] args) { List<Action> actions = new List<Action>(); actions.Add(() => Console.WriteLine("A1")); actions.Add(() => Console.WriteLine("A2")); actions.Add(() => Console.WriteLine("A3")); actions.Add(() => Console.WriteLine("A4")); foreach (var action in actions) { ThreadPool.QueueUserWorkItem(state => action(), null); Thread.Sleep(1); } Console.Read(); } }
这次能够输出正确的结果:
我们也看到很多人确实是这么做的。但是如果真是必须这样的话,这样的编程方式很难让我接受,不知道大家有何高见。
在老赵的提示下,醒悟过来:由于被置于ThreadPool中的操作时异步的,还没有来的执行的时候,action已经被for循环改变,永远是同一个action对象! 呵呵,脑袋有时候有点转不过弯!
所以正确的写法是:
foreach (var action in actions) { var a = action; ThreadPool.QueueUserWorkItem(state => a(), null); }
相关文章推荐
- 难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
- [原创] 难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
- ThreadPool.QueueUserWorkItem的性能问题
- ThreadPool.QueueUserWorkItem 方法 (WaitCallback, Object)
- ThreadPool.QueueUserWorkItem(Func, i);static void Func(object param)
- ThreadPool.QueueUserWorkItem的性能问题
- WPF使用ThreadPool.QueueUserWorkItem线程池防界面假死
- ThreadPool.QueueUserWorkItem
- ThreadPool.QueueUserWorkItem 方法 (WaitCallback)
- 使用ThreadPool.QueueUserWorkItem记录网站错误日志
- 多线程实现Thread.Start()与ThreadPool.QueueUserWorkItem两种方式对比
- 多线程实现Thread.Start()与ThreadPool.QueueUserWorkItem两种方式对比
- ThreadPool.QueueUserWorkItem的性能问题
- C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem
- 使用线程池的方法(非TPL)-ThreadPool.QueueUserWorkItem
- ThreadPool.QueueUserWorkItem的性能问题
- ThreadPool.QueueUserWorkItem的性能问题
- ThreadPool.QueueUserWorkItem性能测试与提高
- 在 .NET Web 开发中,使用 ThreadPool.QueueUserWorkItem 异步地处理耗时操作
- ThreadPool.QueueUserWorkItem 用法