您可以在C#应用程序中创建的最大线程数是多少?当你达到这个限制时会发生什么?是某种抛出的例外吗?
答案 0 :(得分:133)
没有固有的限制。最大线程数由可用物理资源量决定。有关详细信息,请参阅此article by Raymond Chen。
如果你需要询问最大线程数是多少,你可能做错了什么。
[更新:出于兴趣:.NET Thread Pool默认线程数:
(这些数字可能因硬件和操作系统而异)]
答案 1 :(得分:25)
米奇是对的。这取决于资源(内存)。
虽然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中的异常(当然是内存不足)中放置一个断点来查看counter的值。当然,存在非常显着的差异。
答案 2 :(得分:8)
我在使用c#console的64位系统上进行了测试,例外是使用2949个线程的内存不足类型。
我意识到我们应该使用线程池,我这样做,但这个答案是对主要问题的回应;)
答案 3 :(得分:6)
您应该使用线程池(或异步委托,后者又使用线程池),以便系统可以决定应该运行多少个线程。
答案 4 :(得分:4)
Jeff Richter在CLR中通过C#:
“使用CLR 2.0版,最大数量 工作线程默认为机器中每个CPU 25个 和最大I / O数 线程默认为1000.限制1000实际上没有限制。“
请注意,这是基于.NET 2.0的。这可能在.NET 3.5中已经改变。
[编辑]正如@Mitch所指出的,这是CLR ThreadPool特有的。如果你直接创建线程,请参阅@Mitch和其他评论。
答案 5 :(得分:0)
您可以使用以下代码测试:
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位应用程序模式。
答案 6 :(得分:0)
我建议在调试中运行ThreadPool.GetMaxThreads方法
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);