Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET应用程序中的最大线程数?_C#_.net_Multithreading - Fatal编程技术网

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

C# .NET应用程序中的最大线程数?,c#,.net,multithreading,C#,.net,Multithreading,在C#应用程序中可以创建的最大线程数是多少?当你达到这个极限时会发生什么?是否引发了某种异常?没有固有的限制。线程的最大数量由可用的物理资源量决定。具体见此 如果您需要询问最大线程数是多少,那么您可能做错了什么 [更新:只是出于兴趣:.NET线程池默认线程数: 框架4.0中的1023(32位环境) 框架4.0中的32767(64位环境) 框架3.5中每个核心250个 框架2.0中每个核心25个 (这些数字可能因硬件和操作系统而异)通过C#在CLR中的Jeff Richter: “对于CLR的

在C#应用程序中可以创建的最大线程数是多少?当你达到这个极限时会发生什么?是否引发了某种异常?

没有固有的限制。线程的最大数量由可用的物理资源量决定。具体见此

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

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

  • 框架4.0中的1023(32位环境)
  • 框架4.0中的32767(64位环境)
  • 框架3.5中每个核心250个
  • 框架2.0中每个核心25个
(这些数字可能因硬件和操作系统而异)

通过C#在CLR中的Jeff Richter:

“对于CLR的2.0版,最大数量 默认情况下,机器中每个CPU的工作线程数为25 以及I/O的最大数量 线程默认为1000。1000的限制实际上根本没有限制。”

注意这是基于.NET2.0的。这在.NET3.5中可能已经改变


[Edit]正如@Mitch指出的,这是特定于CLR线程池的。如果您正在创建线程,请直接查看@Mitch和其他注释。

Mitch是正确的。它取决于资源(内存)

尽管Raymond的文章专门讨论Windows线程,而不是C#线程,但逻辑也适用于相同的情况(C#线程映射到Windows线程)

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

您可以亲自测试,比较:

    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()
{
线程。睡眠(100000000);
}
静态void Main(字符串[]参数)
{
整数计数=0;
var threadList=新列表();
尝试
{
while(true)
{
线程newThread=newThread(newthreadstart(DummyCall),1024);
newThread.Start();
添加(newThread);
计数++;
}
}
捕获(例外情况除外)
{
}
}
与:

static void DummyCall()
{
线程。睡眠(100000000);
}
静态void Main(字符串[]参数)
{
整数计数=0;
var threadList=新列表();
尝试
{
while(true)
{
线程newThread=newThread(newthreadstart(DummyCall),1024);
添加(newThread);
计数++;
}
}
捕获(例外情况除外)
{
}
}

在VS中的异常(当然是内存不足)中放置一个断点以查看计数器的值。当然,这有一个非常显著的区别。

您应该使用线程池(或者异步delgates,它反过来使用线程池),这样系统就可以决定应该运行多少线程。

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


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

您可以使用以下截取的代码测试它:

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);
   }
}
private static void Main(字符串[]args)
{
int threadCount=0;
尝试
{
对于(int i=0;iThread.Sleep(Timeout.Infinite)).Start();
threadCount++;
}
}
抓住
{
控制台写入线(线程数);
Console.ReadKey(true);
}
}

当心32位和64位模式的应用程序。

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

ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
文档和示例:

如果您运行的是x64虚拟机或x86虚拟机,答案会有所不同。在我的情况下,它是x86,但是如果其他人需要它,您能为这两种虚拟机提供答案吗?您在对.NET 3.5的评论中混淆了CLR 2.0和.NET 2.0。据我所知,SP1用于.NET 2.0(是.NET 3.5的一部分)将线程池的工作线程默认值更改为每个CPU/核心250个。答案是由系统决定。@Ian:我否决了你的投票,因为九个月前也给出了相同的Answare.Link。我不认为任何人会提到线程池。你是怎么知道的?您知道什么是.NET4.5,或者5.0将是什么吗?您可以使用以下代码来获取计数:int workerThreads;int completionPortThreads;GetMaxThreads(out workerThreads,out completionPortThreads)@MitchWheat我自己也在想,因为链接的文章没有讨论.NET,而是简单的'ol C.@LoukMo:如果你不能创建线程,那么你可能已经没有内存了!我没有试过,但我假设会引发内存异常…@Liam链接现在应该修复了。
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);