日期:2014-05-17  浏览次数:20850 次

C#线程池使用的困惑
我看了不少关于线程池的实例,想用用线程池,但我总有点疑问,就是这个线程池ThreadPool不需要声明,
可以直接调用,在同一个应用程序中直接添加任务到线程池中 它会自动按顺序执行吗?比如说我在主窗体上往线程池中
添加一个任务,在另外一个窗体中又添加了一个任务,执行的时候会自动按照先后吗?还有,怎么判断加入的任务
已经执行完毕啊,程序不是马上退出的。
或者有给我一经典的线程池例子,非常感谢。。

------解决方案--------------------
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认堆栈大小,以默认的优先级运行,并处于多线程单元中
ThreadPool用于多线程的运行管理 
static double number1 = -1;
static double number2 = -1;
public static void Main() 
{
int maxThreadNum, portThreadNum;
int minThreadNum;
ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
Console.WriteLine("最大线程数:{0}", maxThreadNum);
Console.WriteLine("最小空闲线程数:{0}", minThreadNum);
int x = 15600;
Console.WriteLine("启动第一个任务:", x);
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
Console.WriteLine("启动第二个任务:",x);
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);
while (number1 == -1 || number2 == -1) ;
Console.WriteLine("y({0}) = {1}", x, number1 + number2);
}
// 启动第一个任务
static void Proc1(object o) 
{
number1 = Math.Pow(Convert.ToDouble(o), 4);
}
// 启动第二个任务
static void Proc2(object o)
{
number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 4.0);
}

多线程
------解决方案--------------------
up
------解决方案--------------------
不一定
------解决方案--------------------
关于微软的这个线程池具体的实现方法俺不太清楚,托管线程最终都会变成一个物理线程来处理任务,所以这个线程池应该是一个关于线程的Window API封装。

我想里面应该有个队列,队列的大小是Windows控制的,可能有地方能设置(就是一个应用程序最多能跑多少线程),可能在注册表里面,由于重新分配线程资源比较低效,所以用个池子把他们管理起来,如果池子里面有空闲的线程对象,拿出来跑下一个待执行的任务。

其实这里涉及两个概念:
Windows核心对象--线程? -- 建议看看《Windows 核心编程》
托管对象如何管理非托管对象? -- 都是内部实现,MSDN上应该有懒得找...