我在使用 .NET 的 ThreadPool (.NET 4) 时遇到了一些问题。
我读到默认情况下 .NET 限制每个处理器 25 个线程,但根据 SO 和其他地方的论坛帖子,我可以使用以下代码增加限制。
void SetThreads(int threads)
{
ThreadPool.SetMaxThreads(threads, threads);
ThreadPool.SetMinThreads(threads, threads);
}
但是,当我将上面的值设置为某个任意高的数字(例如 2000)并排队约 1000 个项目时,我仍然只有约 33 个线程在运行(.NET CLR 需要约 5 个线程),而 ThreadPool .GetAvailableThreads()
返回剩余的 1971 个线程。
为什么上面的代码不起作用?
最佳答案
首先,您对默认设置的“了解”不正确。每个处理器 25 个线程的限制从 .NET 1.1 恢复了。它在 .NET 2 中有所增加,and now :
Beginning with the .NET Framework version 4, the default size of the thread pool for a process depends on several factors, such as the size of the virtual address space. A process can call the GetMaxThreads method to determine the number of threads.
但是,还有其他因素在起作用:线程池不会在所有情况下立即创建新线程。为了应对突发的小任务,它限制了创建新线程的速度。 IIRC,如果有未完成的任务,它将每 0.5 秒创建一个线程,直到最大线程数。虽然我不能立即看到记录的数字,所以它很可能会改变。我强烈怀疑这就是你所看到的。尝试对大量项目进行排队,然后随时间监控线程数。
关于c# - 线程池最大线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6000834/