C# 中的 ThreadPool
2008-01-14 13:48
344 查看
System.Threading.TheadPool 可以看做是若干个Thread组成的队列。
一个进程仅有一个ThreadPool,所以ThreadPool类中都是静态方法。ThreadPool会在首次调用注册线程方法时被创建。(ThreadPool.QueueUserWorkItem、ThreadPool.RegisterWaitForSingleObject等)。
一个ThreadPool里面注册的线程拥有默认的堆栈大小,默认的优先级。并且,他们都存在于多线程空间(Multithreaded apartment)中。
ThreadPool中的Thread不能手动取消,也不用手动开始。所以ThreadPool并不适用比较长的线程。你要做的只是把一个WaitCallback委托塞给ThreadPool,然后剩下的工作将由系统自动完成。系统会在ThreadPool的线程队列中一一启动线程。
当线程池满时,多余的线程会在队列里排队,当线程池空闲时,系统自动掉入排队的线程,以保持系统利用率。
在以下情况中不宜使用ThreadPool而应该使用单独的Thread:
1,需要为线程指定详细的优先级
2,线程执行需要很长时间
3,需要把线程放在单独的线程apartment中
4,在线程执行中需要对线程操作,如打断,挂起等。
Threadpool中线程的注册:
委托:
ThreadPool.QueueUserWorkItem(
new WaitCallback(FunctionCall), PersonalizeDataForTherad);
Timer:
ThreadPool.RegisterWaitForSingleObject(
AutoResetEventObject,
代码示例:
//Coding by zhl
using System;
using System.Threading;
public class TestThreadPool ...{
//Entry of Application
public static void Main() ...{
//Declare delegate WaitCallback
WaitCallback wc = new WaitCallback(run);
for(int i = 0; i < 10; i++)
//Assign thread in the thread pool
ThreadPool.QueueUserWorkItem(wc,i);
while (true)
if(Console.ReadLine().ToLower()=="exit") break;
}
//Function which is pointed by delegate WaitCallback
public static void run(object state) ...{
Console.WriteLine("Starting...");
Console.WriteLine("Thread {0} is started.",state);
Thread.Sleep(10000);
Console.WriteLine("Thread {0} is shutted down.",state);
}
}
new WaitOrTimerCallback(FunctionCall),
PersonalizeData,
TimeOut,
false
);
一个进程仅有一个ThreadPool,所以ThreadPool类中都是静态方法。ThreadPool会在首次调用注册线程方法时被创建。(ThreadPool.QueueUserWorkItem、ThreadPool.RegisterWaitForSingleObject等)。
一个ThreadPool里面注册的线程拥有默认的堆栈大小,默认的优先级。并且,他们都存在于多线程空间(Multithreaded apartment)中。
ThreadPool中的Thread不能手动取消,也不用手动开始。所以ThreadPool并不适用比较长的线程。你要做的只是把一个WaitCallback委托塞给ThreadPool,然后剩下的工作将由系统自动完成。系统会在ThreadPool的线程队列中一一启动线程。
当线程池满时,多余的线程会在队列里排队,当线程池空闲时,系统自动掉入排队的线程,以保持系统利用率。
在以下情况中不宜使用ThreadPool而应该使用单独的Thread:
1,需要为线程指定详细的优先级
2,线程执行需要很长时间
3,需要把线程放在单独的线程apartment中
4,在线程执行中需要对线程操作,如打断,挂起等。
Threadpool中线程的注册:
委托:
ThreadPool.QueueUserWorkItem(
new WaitCallback(FunctionCall), PersonalizeDataForTherad);
Timer:
ThreadPool.RegisterWaitForSingleObject(
AutoResetEventObject,
代码示例:
//Coding by zhl
using System;
using System.Threading;
public class TestThreadPool ...{
//Entry of Application
public static void Main() ...{
//Declare delegate WaitCallback
WaitCallback wc = new WaitCallback(run);
for(int i = 0; i < 10; i++)
//Assign thread in the thread pool
ThreadPool.QueueUserWorkItem(wc,i);
while (true)
if(Console.ReadLine().ToLower()=="exit") break;
}
//Function which is pointed by delegate WaitCallback
public static void run(object state) ...{
Console.WriteLine("Starting...");
Console.WriteLine("Thread {0} is started.",state);
Thread.Sleep(10000);
Console.WriteLine("Thread {0} is shutted down.",state);
}
}
new WaitOrTimerCallback(FunctionCall),
PersonalizeData,
TimeOut,
false
);
相关文章推荐
- c# ThreadPool 判断子线程全部执行完毕的四种方法
- C# 多线程学习(六)线程池(ThreadPool)——线程资源的复用和自动管理
- C# 线程池ThreadPool的用法简析
- IOCP Thread Pool 在 C# 的Safe实现
- C# 线程池ThreadPool的用法简析
- C# 线程池ThreadPool的用法,多线程编程
- c# ThreadPool 判断子线程全部执行完毕的四种方法
- C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
- C#中的thread和task之 Thread & ThreadPool
- C# WinForm多线程(二)---- ThreadPool 与 Timer
- C# 的 Task、Thread、ThreadPool 之间有什么异同?
- C# ThreadPool
- [叩响C#之门]写给初学者:多线程系列( 十一)——线程池(ThreadPool)
- c# WaitHandle类在线程池ThreadPool(超过64个线程时)中的使用方法
- C# 多线程编程之线程池的使用 (ThreadPool)
- C#中Thread与ThreadPool的比较
- C# 多线程编程(3):线程池ThreadPool
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
- C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel