加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用

发布时间:2020-12-16 09:08:17 所属栏目:asp.Net 来源:网络整理
导读:开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack,object state)的方式实现异步调用: 1: class Program 2: { 3: static void Main( string [] args) 4: { 5: ListAction actions = new ListAction(); 6: actions.Add(()

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

   1: class Program
   3:     static void Main(string[] args)
   5:          List<Action> actions = new List<Action>();
   7:         actions.Add(() => Console.WriteLine("A2"));
   9:         actions.Add(() => Console.WriteLine("A4")); 
  11:         foreach (var action in actions)
  13:             ThreadPool.QueueUserWorkItem(state => action(),null);
  15:? 
  17:     }
15: Thread.Sleep(1);
  17:? 
  19:     }
  21:? 

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

?

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

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

所以正确的写法是:

3: var a = action;
   5: }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读