TPL如何决定要创建的线程数

时间:2014-11-21 04:05:17

标签: c# multithreading task-parallel-library threadpool

即使我长时间使用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?标准是什么?我可以增加或减少这个数字吗? 我该如何更改此号码。它是否真的可以或完全从开发人员中抽象出来。

1 个答案:

答案 0 :(得分:2)

来自MSDN

  

可以排队到线程池的操作数仅受可用内存的限制;但是,线程池会限制同时在进程中处于活动状态的线程数。从.NET Framework 4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。进程可以调用GetMaxThreads方法来确定线程数。

另一个MSDN

  

TPL可能会采用各种优化方式,特别是对于大量代表来说。

Another SO question about this。希望这能解渴。