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

时间:2008-09-28 06:05:51

标签: c# .net multithreading

您可以在C#应用程序中创建的最大线程数是多少?当你达到这个限制时会发生什么?是某种抛出的例外吗?

7 个答案:

答案 0 :(得分:133)

没有固有的限制。最大线程数由可用物理资源量决定。有关详细信息,请参阅此article by Raymond Chen

如果你需要询问最大线程数是多少,你可能做错了什么。

[更新:出于兴趣:.NET Thread Pool默认线程数:

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

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

答案 1 :(得分:25)

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

虽然Raymond的文章专门介绍Windows线程,而不是C#线程,但逻辑应用相同(C#线程映射到Windows线程)。

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

你可以自己测试一下,比较一下:

    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中的异常(当然是内存不足)中放置一个断点来查看counter的值。当然,存在非常显着的差异。

答案 2 :(得分:8)

我在使用c#console的64位系统上进行了测试,例外是使用2949个线程的内存不足类型。

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

答案 3 :(得分:6)

您应该使用线程池(或异步委托,后者又使用线程池),以便系统可以决定应该运行多少个线程。

答案 4 :(得分:4)

Jeff Richter在CLR中通过C#:

“使用CLR 2.0版,最大数量 工作线程默认为机器中每个CPU 25个  和最大I / O数 线程默认为1000.限制1000实际上没有限制。“

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

[编辑]正如@Mitch所指出的,这是CLR ThreadPool特有的。如果你直接创建线程,请参阅@Mitch和其他评论。

答案 5 :(得分:0)

您可以使用以下代码测试

private static void Main(string[] args)
{
   int threadCount = 0;
   try
   {
      for (int i = 0; i < int.MaxValue; i ++)
      {
         new Thread(() => Thread.Sleep(Timeout.Infinite)).Start();
         threadCount ++;
      }
   }
   catch
   {
      Console.WriteLine(threadCount);
      Console.ReadKey(true);
   }
}

提防32位和64位应用程序模式。

答案 6 :(得分:0)

我建议在调试中运行ThreadPool.GetMaxThreads方法

ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);

文档和示例: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8