.NET应用程序中的最大线程数?

在C#应用程序中可以创build的最大线程数是多less? 当达到这个极限时会发生什么? 是抛出的某种exception?

没有固有的限制。 线程的最大数量由可用物理资源的数量决定。 有关详情,请参阅Raymond Chen的文章 。

如果你需要问什么线程的最大数量,你可能做错了什么。

[ 更新 :只是出于兴趣:.NET线程池默认线程数:

  • Framework 4.0(32位环境)中的1023
  • Framework 4.0中的32768(64位环境)
  • 框架3.5中每个核心250个
  • Framework 2.0中每个核心25个

(这些数字可能因硬件和操作系统而异)]

米奇是对的。 这取决于资源(内存)。

尽pipeRaymond的文章专门针对Windows线程,而不是针对C#线程,但逻辑应用相同(C#线程映射到Windows线程)。

然而,就像我们在C#中一样,如果我们想要完全精确的话,我们需要区分“开始”和“未开始”的线程。 只有启动的线程实际上保留了堆栈空间(正如我们所期望的)。 未启动的线程只分配线程对象所需的信息(如果对实际成员感兴趣,则可以使用reflection器)。

你可以亲自testing一下,比较一下:

static void DummyCall() { Thread.Sleep(1000000000); } static void Main(string[] args) { int count = 0; var threadList = new List<Thread>(); try { while (true) { Thread newThread = new Thread(new ThreadStart(DummyCall), 1024); newThread.Start(); threadList.Add(newThread); count++; } } catch (Exception ex) { } } 

有:

  static void DummyCall() { Thread.Sleep(1000000000); } static void Main(string[] args) { int count = 0; var threadList = new List<Thread>(); try { while (true) { Thread newThread = new Thread(new ThreadStart(DummyCall), 1024); threadList.Add(newThread); count++; } } catch (Exception ex) { } } 

在VS中的exception(当然内存不足)中放置一个断点来查看计数器的值。 当然有一个非常显着的区别。

我用c#console在64位系统上做了一个testing,例外是使用2949个线程的内存不足。

我意识到我们应该使用线程池,我这样做,但这个答案是对主要问题的回应;)

你应该使用线程池(或asynchronous分配,这反过来使用线程池),以便系统可以决定应该运行多less个线程。

Jeff Richter通过C#在CLR中获得:

“对于CLR 2.0版本,机器上每个CPU的最大工作线程数默认为25,并且I / O线程的最大数量默认为1000.对1000的限制根本没有限制。

注意这是基于.NET 2.0的。 这可能已经在.NET 3.5中改变了。

正如@Mitch所指出的,这是CLR ThreadPool特有的。 如果您直接创build线程,请参阅@Mitch和其他评论。