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

130 .net c# multithreading

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

Mit*_*eat 138

没有固有的限制.最大线程数由可用物理资源量决定.有关详细信息,请参阅Raymond Chen撰写的这篇文章.

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

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

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

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

  • 你是怎么想出来的?你知道.NET 4.5是什么,或者5.0将是什么? (12认同)
  • 您可以使用此代码来获取计数:int workerThreads; int completionPortThreads; ThreadPool.GetMaxThreads(输出workerThreads,输出completionPortThreads); (3认同)

ant*_*nio 26

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

虽然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)
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

有:

   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)
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

在VS中的异常(当然是内存不足)中放置一个断点来查看counter的值.当然,存在非常显着的差异.


小智 8

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

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


Ian*_*oyd 6

您应该使用线程池(或async delgates,它反过来使用线程池),以便系统可以决定应该运行多少线程.

  • 链接.我没有看到任何线程池的提及作为任何人的答案. (10认同)

ivk*_*vke 5

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

ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
Run Code Online (Sandbox Code Playgroud)

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