Mit*_*eat 138
没有固有的限制.最大线程数由可用物理资源量决定.有关详细信息,请参阅Raymond Chen撰写的这篇文章.
如果您需要询问最大线程数是多少,那么您可能做错了什么.
[ 更新:只是出于兴趣:.NET Thread Pool默认线程数:
(这些数字可能因硬件和操作系统而异)]
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的值.当然,存在非常显着的差异.
我建议在调试中运行 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