C# 2000个工作线程,只有很少的真实线程

C# 2000个工作线程,只有很少的真实线程,c#,.net,multithreading,visual-studio,C#,.net,Multithreading,Visual Studio,我暂停VS并来到线程窗口。我看到有超过2000个具有相同调用堆栈和不同Id的“工作线程”条目(线程是使用Task.Factory.StartNew创建的 方法) 所有这些线程都在等待解锁一个锁。这可能是我的应用程序中的一个错误。问题是,当我来到任务管理器时,我看到了+标准的线程和内存使用量。这是一个没有很多空闲线程的CLR优化,还是VS线程窗口错误?这是代码中的一个错误。死锁是一种常见的线程错误 可以达到2000个线程。线程池管理器的任务是限制可以运行的线程数。由其SetMaxThreads()

我暂停VS并来到线程窗口。我看到有超过2000个具有相同调用堆栈和不同Id的“工作线程”条目(线程是使用
Task.Factory.StartNew创建的
方法)


所有这些线程都在等待解锁一个锁。这可能是我的应用程序中的一个错误。问题是,当我来到任务管理器时,我看到了+标准的线程和内存使用量。这是一个没有很多空闲线程的CLR优化,还是VS线程窗口错误?

这是代码中的一个错误。死锁是一种常见的线程错误

可以达到2000个线程。线程池管理器的任务是限制可以运行的线程数。由其SetMaxThreads()方法管理。默认值是一个可笑的大数字,在我的4核笔记本电脑上是1023。根据.NET版本的不同,您可能有一台8核的机器。事实上,启动这么多需要一段时间


死锁是更容易解决的线程错误,您有很多时间来查看调用堆栈,找出它们在哪里死锁。与线程竞速bug不同,当您现在移除导致死锁的任何锁时,都会遇到真正令人讨厌的bug。临时调用ThreadPool.SetMaxThreads(41000)来限制杀戮是一个不错的策略,它不会淹没在要查看的线程数量中,使调试尝试看起来徒劳。

@Corak Did OP将线程与进程进行了比较?可能是个bug,我有一些类似的代码,我认为每次调用时都会启动一个新线程(并在等待时暂停)实际上一直都在创建线程。并且没有等待调用发生。每次调用StartNew都将创建一个新线程。如果这不能解决问题,您可以发布一些代码吗?(另请参阅:)任务!=线程。事实上,添加任务只是为了有一个轻量级的多任务解决方案。请阅读msdn上关于任务的基础知识。@GameAlchemist
Task!=线程
我同意,但您在visual studio的
Threads窗口
中看到的实际上是线程。这就是OP的作用。(可能是个bug)问题有点不同,为什么taskmanager中的线程数比VS线程窗口中的线程数要小。但我喜欢你们的答案,这对ThreadPool.SetMaxThreads是个好主意。所以谢谢,我接受了。嗯……我在设置ThreadPool.SetMaxThreads(4,10000)时遇到了一些额外的麻烦(新死锁)…当我设置此设置时,一些应该初始化我的服务的方法永远无法启动,因为我同时需要4个以上的任务。因此,在限制此值时,我们需要非常小心。祝贺你,你已经找到了如何在几秒钟而不是几小时内诊断程序出现问题的方法。在p生产,更难诊断。