即使我长时间使用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?标准是什么?我可以增加或减少这个数字吗? 我该如何更改此号码。它是否真的可以或完全从开发人员中抽象出来。
答案 0 :(得分:2)
来自MSDN:
可以排队到线程池的操作数仅受可用内存的限制;但是,线程池会限制同时在进程中处于活动状态的线程数。从.NET Framework 4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。进程可以调用GetMaxThreads方法来确定线程数。
另一个MSDN:
TPL可能会采用各种优化方式,特别是对于大量代表来说。
Another SO question about this。希望这能解渴。