c# 多线程 线程池(ThreadPool) 2 如何控制线程池? 本页内容只是个人拙见。 线程池启动了,但是没有方法去控制线程池,如果子线程出现了问题,难道线程池就死了吗? 我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢。 线程池里线程的执行不影响主线程的运行的。 线程池中有一个东西叫做 信号灯 AutoResetEvent和ManualResetEvent
下面是一个例子:
- public class Program
- {
- const int cycleNum = 10;
- static AutoResetEvent myEvent = new AutoResetEvent(false);
- static void Main(string[] args)
- {
- ThreadPool.SetMinThreads(1, 1);
- ThreadPool.SetMaxThreads(2, 2);
- for (int i = 1; i <= cycleNum; i++)
- {
- ThreadPool.QueueUserWorkItem(new WaitCallback(testFun), i.ToString());
- }
- Console.WriteLine("主线程执行!");
- Console.WriteLine("主线程结束!");
- Console.WriteLine("阻塞");
- myEvent.WaitOne();
- Console.WriteLine("线程池终止!");
- Console.ReadKey();
- }
- public static void testFun(object obj)
- {
- Console.WriteLine(string.Format("{0}:第{1}个线程", DateTime.Now.ToString(), obj.ToString()));
- Thread.Sleep(5000);
- if (obj.ToString() == cycleNum.ToString())
- {
- Console.WriteLine("终止了");
- myEvent.Set();
- }
- }
- }
复制代码
代码的信号灯的作用,当任务全部投放在线程池中,我们开启了阻塞线程池。 之后,我们又在执行的函数中,添加了代码,也就是
- if (obj.ToString() == cycleNum.ToString())
- {
- Console.WriteLine("终止了");
- myEvent.Set();
- }
复制代码
很明显,我们判断了当前执行的数量以及我们项目的总数量。如果达到总数量,则代表线程池已经执行完毕,我们可以监控他是否完毕,
当代码:myEvent.WaitOne(); 执行了,它不仅阻塞,他会等待。等到我们的myEvent.Set(); 信号发出之后,即可恢复继续执行。 各位不妨复制试一下,本页所有内容均为个人理解,如果您有意见或者我这里写的有问题,欢迎您评论指点 本人也是初入c# 希望和大家一起交流、 博客:http://www.lazyw.org/post-59.html
|