我暂停了VS并进入了线程窗口。我看到了>具有相同调用堆栈和不同Id的2000“工作线程”条目(线程使用Task.Factory.StartNew
创建
法)。
所有这些线程都在等待解锁一个锁。这可能是我的应用程序中的错误。问题是,当我来到任务管理器时,我看到了 - 标准数量的线程和内存使用情况。这是一个CLR优化,没有很多空闲线程,或VS线程窗口错误?
答案 0 :(得分:2)
这是您的代码中的错误。死锁是常见的线程错误之一。
可以获得2000个线程。 ThreadPool管理器的工作是限制可以运行的线程数。由其SetMaxThreads()方法管理。在我的4核笔记本电脑上,默认值是一个非常大的数字,1023。也取决于.NET版本,你可能有一个8核心机器。实际上,开始这么多人需要一段时间。
死锁是更容易解决的线程错误,你有一个很多的时间来查看调用堆栈以找出它们死锁的位置。与线程竞争错误不同,当您删除任何锁定时,您可能会遇到真正令人讨厌的错误导致僵局。暂时调用ThreadPool.SetMaxThreads(4,10000)来限制大屠杀是一个不错的策略,不要淹没线程的数量,使调试尝试看起来徒劳无功。