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

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

来自 MSDN:

可以排队到线程池的操作数

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

另一个 MSDN:

TPL 可以采用各种优化,尤其是对于大量委托。

关于这个的另一个SO问题。希望这能解渴。