首页 > 代码库 > 关于.net framework 线程池的理解

关于.net framework 线程池的理解

线程池是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);
            }

 

关于.net framework 线程池的理解