html5中文学习网

您的位置: 首页 > 网站及特效实例 > jquery特效 » 正文

C# ThreadPool.QueueUserWorkItem典型案例详解_编程语言综合

[ ] 已经帮助:人解决问题

   using System;WVMHTML5中文学习网 - HTML5先行者学习网

  using System.Collections.Generic;WVMHTML5中文学习网 - HTML5先行者学习网

  using System.Threading;WVMHTML5中文学习网 - HTML5先行者学习网

  namespace ThreadPoolTestWVMHTML5中文学习网 - HTML5先行者学习网

  {WVMHTML5中文学习网 - HTML5先行者学习网

  class ProgramWVMHTML5中文学习网 - HTML5先行者学习网

  {WVMHTML5中文学习网 - HTML5先行者学习网

  static void Main(string[] args)WVMHTML5中文学习网 - HTML5先行者学习网

  {WVMHTML5中文学习网 - HTML5先行者学习网

  //声明一个Action委托的List,添加一些委托测试用WVMHTML5中文学习网 - HTML5先行者学习网

  List actions = new ListWVMHTML5中文学习网 - HTML5先行者学习网

  {WVMHTML5中文学习网 - HTML5先行者学习网

  ()=>{Console.WriteLine("A-1");},WVMHTML5中文学习网 - HTML5先行者学习网

  ()=>{Console.WriteLine("A-2");},WVMHTML5中文学习网 - HTML5先行者学习网

  ()=>{Console.WriteLine("A-3");},WVMHTML5中文学习网 - HTML5先行者学习网

  ()=>{Console.WriteLine("A-4");}WVMHTML5中文学习网 - HTML5先行者学习网

  };WVMHTML5中文学习网 - HTML5先行者学习网

  //遍历输出结果WVMHTML5中文学习网 - HTML5先行者学习网

  foreach (var action in actions)WVMHTML5中文学习网 - HTML5先行者学习网

  {WVMHTML5中文学习网 - HTML5先行者学习网

  ThreadPool.QueueUserWorkItem(state => action() , null);WVMHTML5中文学习网 - HTML5先行者学习网

  }WVMHTML5中文学习网 - HTML5先行者学习网

  Console.ReadKey();WVMHTML5中文学习网 - HTML5先行者学习网

  }WVMHTML5中文学习网 - HTML5先行者学习网

  }WVMHTML5中文学习网 - HTML5先行者学习网

  }WVMHTML5中文学习网 - HTML5先行者学习网

  这个很意外的结果如下:WVMHTML5中文学习网 - HTML5先行者学习网

C# ThreadPool.QueueUserWorkItem典型案例详解 三联

  为什么如此呢:WVMHTML5中文学习网 - HTML5先行者学习网

  我分析下,首先大家都知道创建一个线程是需要时间的,线程池作为一个管理线程的对象操作简单,但是涉及到具体细节的时候却很难控制,其原理是当线程池收到请求以后,则从线程池中找到一个闲的线程分配给它,然后启动。 但是线程池的线程从创建到启动需要时间,但是主线程的循环显然只是瞬间完成,完全没必要夹杂在线程池的等待中,因此出现了主线程执行完循环最后是的线程池收到的请求委托是列表中的最后一个,如何解决?WVMHTML5中文学习网 - HTML5先行者学习网

  方式一: Thread.Sleep(1);WVMHTML5中文学习网 - HTML5先行者学习网

  博主说对于Thread.Sleep(N)的方式难以接受,其实只要细细去分析原理,就能知道这个方式是可以接受甚至是微妙的,Thread.Sleep(N)是对当前线程阻塞一定时间,那这个处理不论是主线程还是线程池中的线程都是有效果的,至少为线程池中的线程的请求与启动赢得了时间。当然在这里阻塞的线程一定是主线程,使其不能得到CPU时间,这样也就成功了得到预期结果。WVMHTML5中文学习网 - HTML5先行者学习网

  后来又采取另外一种方式,WVMHTML5中文学习网 - HTML5先行者学习网

  方式二:WVMHTML5中文学习网 - HTML5先行者学习网

  foreach (var action in actions)WVMHTML5中文学习网 - HTML5先行者学习网

  {WVMHTML5中文学习网 - HTML5先行者学习网

  var Tempaction = action;WVMHTML5中文学习网 - HTML5先行者学习网

  ThreadPool.QueueUserWorkItem(state => Tempaction() , null);WVMHTML5中文学习网 - HTML5先行者学习网

  }WVMHTML5中文学习网 - HTML5先行者学习网

  将循环中的变量存储到一个临时变量中,为什么这样行呢?WVMHTML5中文学习网 - HTML5先行者学习网

  大家知道线程池是有请求就为其分配一个自由线程与其工作,当每一次循环中的变量不同也就是对象不同时这时候每次请求出现差异,当然线程池必须为每一个做准备,不同于把循环变量直接作为请求,这时候每一个请求就按顺序依次准备好依次启动。当然也就成功了。WVMHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助