TPL 如何决定要创建的线程数
本文关键字:创建 线程 决定 何决定 TPL | 更新日期: 2023-09-27 18:31:30
即使我长时间使用TPL,但对我来说听起来很新。我想了解带有线程池的 TPL,并在 .NET Framework 4.0 中为如下所示创建了一个 POC。
public class CustomData
{
public long CreationTime;
public int Name;
public int ThreadNum;
}
public class TPLSample
{
public int MaxThread = 0;
public void Start()
{
Task[] taskArray = new Task[10000];
for (int i = 0; i < taskArray.Length; i++)
{
taskArray[i] = Task.Factory.StartNew((Object obj) =>
{
var data = new CustomData() { Name = i, CreationTime = DateTime.Now.Ticks };
Thread.SpinWait(10000);
data.ThreadNum = Thread.CurrentThread.ManagedThreadId;
if (Thread.CurrentThread.ManagedThreadId > MaxThread)
{
MaxThread = Thread.CurrentThread.ManagedThreadId;
}
Console.WriteLine("Task #{0} created at {1} on thread #{2}.",
data.Name, data.CreationTime, data.ThreadNum);
},
i);
}
Task.WaitAll(taskArray);
Console.WriteLine("Max no of threads {0}", MaxThread);
}
}
我发现只创建了 14 个线程来完成此任务!!
但是为什么是14?标准是什么?我可以增加或减少这个数字吗?如何更改此数字。它真的可能还是完全从开发人员中抽象出来。
来自 MSDN:
可以排队到线程池的操作数仅受可用内存的限制;但是,线程池限制进程中可以同时处于活动状态的线程数。从 .NET Framework 4 开始,进程线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。进程可以调用 GetMaxThreads 方法来确定线程数。
另一个 MSDN:
TPL 可以采用各种优化,尤其是对于大量委托。
关于这个的另一个SO问题。希望这能解渴。