我已经按照以下方式设置了我的线程池:
ThreadPool.SetMaxThreads(10000, 10000);
ThreadPool.SetMinThreads(20, 20);
然而,在重负载下我的应用开始出现挂起现象。这似乎是因为工作任务没有执行:我使用了ThreadPool.QueueUserWorkItem来运行一些任务,这些任务又使用相同的方法来排队其他工作。显然,这在有限线程池中是很危险的(死锁情况),但我使用线程池不是为了限制最大线程数,而是为了减少线程创建开销。
我看到那里的潜在陷阱,但我相信设置池中最多10000个线程将意味着如果一个项被排队,所有线程都忙碌,并且池中没有10000个线程,那么一个新线程将被创建并在那里处理任务。
然而,我改成了这样:
ThreadPool.SetMaxThreads(10000, 10000);
ThreadPool.SetMinThreads(200, 200);
...应用程序开始运行。如果这使它开始工作,那么我是否忽略了线程池从最小值向最大值扩展的方式/时间的某些内容?