C#-QueuedTaskScheduler-线程数与maxConcurrencyLevel

C#-QueuedTaskScheduler-线程数与maxConcurrencyLevel,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,我从QueuedTaskScheduler.cs中看到了下面的内容,但我不太清楚 threadCount-要创建并用于处理工作项的线程数。 maxConcurrencyLevel-此计划程序工作允许的最大并发度 问题-threadCount与maxConcurrencyLevel之间的区别是什么?threadCount是为您的任务创建的物理线程数量,这些线程将通过调度程序完成。这意味着您的应用程序将创建一组具有给定限制的线程 线程控制。当QueuedTaskScheduler在另一个TaskSc

我从
QueuedTaskScheduler.cs
中看到了下面的内容,但我不太清楚

threadCount
-要创建并用于处理工作项的线程数。
maxConcurrencyLevel
-此计划程序工作允许的最大并发度


问题-threadCount与maxConcurrencyLevel之间的区别是什么?

threadCount
是为您的任务创建的物理线程数量,这些线程将通过调度程序完成。这意味着您的应用程序将创建一组具有给定限制的线程

线程控制。当
QueuedTaskScheduler
在另一个
TaskScheduler
上使用时,以及与调度程序的专用线程一起使用时,优先级、公平性和并发级别控制都适用。但是,
QueuedTaskScheduler
在请求专用线程时,还对调度程序使用的线程提供非常低级的控制

maxConcurrencyLevel
是计划程序中并发执行的大量任务。这意味着您的计划程序将同时处理有限数量的任务

并发级别。在大型系统中,您可能希望控制系统不同部分的并行度。使用并行循环和PLINQ查询,您可以在每个循环或每个查询的基础上进行控制,但开箱即用的方法无法跨循环进行控制,也没有内置的方法来控制任务。通过将所有相关工作调度到实施最大并发级别的
任务调度器
,可以获得该功能

这些数字看起来很相似,但却有很大的不同。线程数应该几乎等于应用程序服务器上的内核数,因为理论上这有助于避免上下文切换开销

至于并发级别,这个数字可能几乎等于线程数(或者线程数+1),或者如果任务非常小,那么它可能会比线程数大很多,因此处理器会很快完成任务

总之,您应该尝试不同的组合,并测量系统性能


您还可以在

上看到一些示例,QueuedTaskScheduler在哪里?它是来自的任务调度器之一,感谢您的澄清。我仍然不太清楚并发级别这个术语。如果我并行执行20个不同的查询,那么什么可以控制它的并发性呢?我需要在代码中添加任何lock语句吗?TPL将自行控制同时执行的任务的数量,不需要您的锁定-仅当您需要一些同步时谢谢您提供的信息。