Creating or destroying a thread takes a fair amount of work. Therefore, if you pool threads, your program executes more efficiently since you get rid of the overhead associated with creating and destroying threads. There is one thread pool per process. To queue work to execute by this pool of worker threads, call any of the ThreadPool static methods. QueueUserWorkItem( ) queues a delegate to execute when one of the pool’s threads becomes free. RegisterWaitForSingleObject( ) takes a WaitHandle and executes the specified method either when the WaitHandle is in the signaled state or when a time-out occurs. BindHandle( ) and UnsafeQueueUserWorkItem( ) are provided for compatibility with the Win32 API.

public sealed class ThreadPool {
// Public Static Methods
   public static bool BindHandle(IntPtr osHandle);
   public static void GetAvailableThreads(out int workerThreads, out int completionPortThreads);
   public static void GetMaxThreads(out int workerThreads, out int completionPortThreads);
   public static void GetMinThreads(out int workerThreads, out int completionPortThreads);
   public static bool QueueUserWorkItem(WaitCallback callBack);
   public static bool QueueUserWorkItem(WaitCallback callBack, object state);
   public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject,
       WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
   public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle ...

Get C# in a Nutshell, Second Edition now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.