c# - 线程池行为 : not growing from minimum size

标签 c# multithreading threadpool

我是这样设置我的线程池的:

ThreadPool.SetMaxThreads(10000, 10000);
ThreadPool.SetMinThreads(20, 20);

但是,我的应用程序在负载过重时开始挂起。这似乎是因为工作任务没有执行:我曾使用 ThreadPool.QueueUserWorkItem 来运行一些任务,这些任务又使用相同的方法对进一步的工作进行排队。对于有限的线程池(死锁情况),这显然是危险的,但我使用线程池不是为了限制最大线程数,而是为了减少线程创建开销。

我可以看到那里的潜在陷阱,但我相信在池中设置最多 10000 个线程将意味着如果一个项目排队,所有线程都很忙,并且池中没有 10000 个线程,a将创建一个新的并在那里处理任务。

不过,我改成了这样:

ThreadPool.SetMaxThreads(10000, 10000);
ThreadPool.SetMinThreads(200, 200);

..应用程序开始运行。如果这使它开始工作,我是否遗漏了有关线程池如何/何时从最小大小扩展到最大大小的信息?

最佳答案

无论何时使用线程池,您都受制于它的“线程注入(inject)和退出算法”。

该算法没有正确记录(据我所知)并且不可配置。

如果您正在使用任务,您可以编写自己的 Task Scheduler

关于c# - 线程池行为 : not growing from minimum size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9248199/

相关文章:

multithreading - 如何在线程之间共享对 AtomicBool 的访问?

java - 使用线程处理列表的智能方法

c++ - 线程池编译错误

C# 对象构造函数重载

c# - 如何处置在任务中使用的 MemoryStream?

java - 如何让 KeyListener 使用主线程而不是 EDT?

具有已知池大小但未知工作人员的 Java- FixedThreadPool

c# - 如何获取已打开连接的套接字 ID/句柄/描述符? (.NET,C++,德尔福)

c# - 如何动态地添加或删除数据 GridView 中的列

c# - .NET 中的线程池和 .IsBackground