C# .NET应用程序中的最大线程数?
在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的
- 框架4.0中的1023(32位环境)
- 框架4.0中的32767(64位环境)
- 框架3.5中每个核心250个
- 框架2.0中每个核心25个
[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);