c# - 线程池最大线程数

标签 c# .net multithreading threadpool

我在使用 .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/

相关文章:

java - AppCompatActivity 改变了我的 AlertDialog 设计

c# - 如何配置 NLog 以写入数据库?

c# - 为什么 OS X 在复制到 Samba 共享时不像 Windows 那样锁定文件?

c++ - 在 C++ 中,是否有任何理由产生并立即加入线程,而不是直接调用函数?

c++ - 如何保证两个线程中的两个类写同一个变量线程安全?

c# - VS 如何知道异常是否是用户未处理的

c# - 使用哪种对象集合类型?

c# - SCOPE_INDENTITY() 不工作它返回 null 吗?

c# - JsonPropertyAttribute 在派生类中的私有(private)属性上被忽略

Java:使用 ExecutorService 实现并发