class Program
{
static void DoIt(string name)
{
Console.WriteLine($"{DateTime.Now}, Thread{name} started");
Thread.Sleep(50000);
Console.WriteLine($"{DateTime.Now}, Thread{name} done");
}
static void Main()
{
//ThreadPool.SetMinThreads(100, 100);
for (int i = 0; i < 100; i++)
{
int value = i;
ThreadPool.QueueUserWorkItem((s) =>
{
string name = value.ToString();
DoIt(name);
});
}
Console.ReadKey();
}
}
程序结果:结果
2021年4月26日11:26:23,线程2开始
2021/4/26 11:26:22,线程0开始
2021/4/26 11:26:23,线程1开始
2021/4/2611:26:24,线程4开始
1021/4/2611:26:25,线程5开始
3021/4/26,11:26:26,线程6开始2021/4/26 11:26:29,Thread9启动
同时启动100个线程。前4个线程非常快。后一个线程每秒启动一个,直到一些工作线程完成为止。
- 为什么前4个线程很快?我电脑的cpu核心是4。如果程序在8或32核计算机中运行,则前8或32个线程很快,其他线程则很慢
- 如果将MinThreads设置为100,则所有100个线程都会快速启动
如果我不设置MinThreads,为什么后面的线程启动如此缓慢?
- .NET线程池将提供线程,直到达到最小值(Threadpool.GetMinThreads(为止,不会有任何延迟
- 之后,线程池可以等待任务完成(排队(或创建新线程(直到到达threadpool.GetMaxThreads(
- ThreadPool何时创建新线程的实际算法没有记录在案,因为它不断发展。但这取决于它运行的硬件和它计算的一系列统计数据
- 通过将SetMinThreads设置为100,您实际上是在告诉.NET线程池提供100个线程,而不会提出任何问题。这就是线程启动快的原因
- 将MinThreads设置为高值有其自身的缺点。。。(您应该看到内存使用量的增加,因为每个线程都需要有自己的内存用于调用堆栈等,并且当您达到更高的线程数量时,处理器将花费更多的时间只进行上下文切换,而不是实际处理(
- minthreads的默认值取决于内核数量和.net框架版本。这就是为什么当你移动到不同的硬件时,行为会发生变化