Answers:
没有内在的限制。线程的最大数量由可用的物理资源量决定。有关详细信息,请参见Raymond Chen的这篇文章。
如果您需要询问最大线程数是多少,可能是您做错了什么。
[ 更新:只是出于兴趣:.NET线程池的默认线程数:
(这些数字可能会因硬件和操作系统而异)]
米奇是对的。这取决于资源(内存)。
尽管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中的异常(当然是内存不足)中放置一个断点,以查看计数器的值。当然,有很大的不同。
通过C#在CLR中的Jeff Richter:
“使用CLR 2.0版时,计算机中每个CPU的最大工作线程数默认为25,而I / O线程的最大数默认为1000。限制1000实际上根本没有限制。”
请注意,这是基于.NET 2.0的。在.NET 3.5中可能已更改。
[编辑]正如@Mitch所指出的,这特定于CLR ThreadPool。如果直接创建线程,请参见@Mitch和其他注释。
您可以使用以下代码进行测试:
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位应用程序模式。
我建议在调试中运行ThreadPool.GetMaxThreads方法
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
文档和示例:https : //docs.microsoft.com/zh-cn/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8