您的位置:首页 > 编程语言 > C#

C# 多线程 线程池(ThreadPool) 2 如何控制线程池?

2017-11-16 09:35 344 查看
线程池启动了,但是没有方法去控制线程池,如果子线程出现了问题,难道线程池就死了吗?

我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢。

线程池里线程的执行不影响主线程的运行的。

线程池中有一个东西叫做 信号灯 下面是一个例子:

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(); 信号发出之后,即可恢复继续执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: