线程池是C#并行开发的基础,C#中的Task、委托的异步等,内部使用的都是线程池。线程池中所有的线程都是后台线程。
线程池顾名思义,拥有一定数量的活动线程,供程序调用。在windows系统中,进程是程序资源的集合,线程则是真正的执行单元,如果一个主机有多个逻辑CPU,程序就可以并行运行。但是建立线程需要耗费时间,消耗内存,如果频繁的建立和销毁会很影响程序性能。线程池机制则可以很好的弥补这一点。当使用线程池执行异步任务时,任务调度器会将任务放到线程池中的线程中执行,任务完成后也不会销毁线程,而是继续等待执行用户的其他任务。如果线程池中的线程都在执行任务,则线程池就会建立新的线程。
//获得最小线程数 int minWorkerThread, minPortThread; ThreadPool.GetMinThreads(out minWorkerThread, out minPortThread); Console.WriteLine(minWorkerThread.ToString()+" "+ minPortThread.ToString()); //获得最大线程数 int maxWorkerThread, maxPortThread; ThreadPool.GetMaxThreads(out maxWorkerThread, out maxPortThread); Console.WriteLine(maxWorkerThread.ToString() + " " + maxPortThread.ToString()); //获得可以建立的线程数(即最大线程数和线程池中已经存在的线程数的差值) int availableWorkerThread, availablePortThread; ThreadPool.GetAvailableThreads(out availableWorkerThread, out availablePortThread); Console.WriteLine(availableWorkerThread.ToString() + " " + availablePortThread.ToString());
线程池线程设置有最小线程数和最大线程数,最小线程数一般和逻辑CPU数量相当。而最大线程数,在.net4.0中分别是32767(工作线程),1000(IO线程)。最大线程数和最小线程数可以设置。当线程池中的线程数量低于最小线程数时,如果此时需要新的线程,会立即建立。而当大于最小线程数时,线程池会等待500毫秒来观察是否需要建立新的线程。所以此时建立新的线程的时间会大于500毫秒。当已经达到最大线程数时,就不会再建立新的线程。如果有新的任务,线程池会让任务排队等待,直到有可用的线程。另外,当线程池线程空闲时,一定的时间后会自动销毁。
线程池一般用来执行时间较短、对任务的开始执行时间和执行顺序要求不严格的任务,这样能最大限度的利用线程池的优势。另外,超过最小线程数时建立新的线程时间会大于500毫秒,可以根据需要修改线程池线程最小线程数量来满足程序的实际需要。
// 在这里只设置工作线程 //根据需要设置 int appMinThreadCount =5; //获得最小线程数 int minWorkerThread, minPortThread; ThreadPool.GetMinThreads(out minWorkerThread, out minPortThread); if (appMinThreadCount > minPortThread) { var result=ThreadPool.SetMinThreads(appMinThreadCount, minPortThread); //返回值用来判断是否设置成功 Console.WriteLine(result); }
时间: 2024-09-30 10:03:00