C# 对于并行任务的最大数量是否有一般规则?

C# 对于并行任务的最大数量是否有一般规则?,c#,.net,parallel-processing,task-parallel-library,C#,.net,Parallel Processing,Task Parallel Library,我第一次使用并行任务,而不是使用传统的线程池。在我的应用程序中,我允许用户输入开始完成作业的任务数。(工作岗位可能很大)。我注意到,如果我允许任何超过10个的任务,应用程序就会开始挂起,而且由于使用的资源,我的性能实际上会变得更差 我想知道处理器的数量和最大任务量之间是否有任何关联,这样我就可以限制用户pc的最大任务量,从而不会减慢速度 TPL将自动更改任务的调度方式,并随着时间的推移添加或删除线程池线程。这意味着,如果有足够的时间和类似的工作,默认行为应该改进为最佳选择 默认情况下,它将首先使

我第一次使用并行任务,而不是使用传统的线程池。在我的应用程序中,我允许用户输入开始完成作业的任务数。(工作岗位可能很大)。我注意到,如果我允许任何超过10个的任务,应用程序就会开始挂起,而且由于使用的资源,我的性能实际上会变得更差


我想知道处理器的数量和最大任务量之间是否有任何关联,这样我就可以限制用户pc的最大任务量,从而不会减慢速度

TPL将自动更改任务的调度方式,并随着时间的推移添加或删除线程池线程。这意味着,如果有足够的时间和类似的工作,默认行为应该改进为最佳选择

默认情况下,它将首先使用比内核更多的线程,因为许多任务不是“纯CPU”。如果您看到额外的任务会导致速度减慢,那么您可能会遇到资源争用(通过锁定),或者您的任务受到CPU的限制,并且任务多于处理器内核会导致速度减慢。如果这会有问题,您可以创建一个自定义来限制一次允许的任务数,例如。这允许您将任务数量限制为纯CPU场景中的处理器数量


如果您的任务受到其他因素(如IO)的约束,则您可能需要分析以确定并发调度任务的数量和吞吐量之间的最佳平衡,尽管这是系统特定的。

否,主要是因为没有任务定义。任务可以是CPU密集型(限制类似于核心*因子)、IO密集型(限制可能非常低)或网络密集型(不希望同时处理1000个请求)


因此,作为一名程序员,你需要运用你的大脑,提出一个概念,然后验证它,然后将它放入你的程序中,这取决于任务实际是什么以及瓶颈在哪里。这样的计划可能很复杂-非常复杂-但大多数情况下都很简单。

假设您的任务是CPU密集型的(即,它们不会执行很多i/O阻塞,例如读取文件),您可能希望将并行任务的数量限制为应用程序可用的CPU核心数量。例如,如果您的应用程序在具有四核处理器(即4核)的计算机上运行,则将其限制为同时执行4个任务


如果您的任务受到CPU以外的限制(例如磁盘访问、网络访问等),那么您需要计算每个任务平均占用的资源份额。如果您知道平均值,那么为了充分利用您的资源,您应该运行的任务数是
100/平均值

我想这取决于您的线程在做什么。磁盘I/O访问?内存计算?通常,在编译库时,我总是希望机器上最多有2*个处理内核,但通常对于任何内置线程任务,我倾向于使用1对1的cpu内核。我的一般规则是从1.5/2高cpu线程到处理单元的因数开始。这通常对我来说效果很好,但取决于实际的代码和硬件。运行一些测试并保持灵活性。您的意思是“每2个处理单元1.5个CPU密集型线程”还是“每2个处理单元1.5到2个CPU密集型线程”?@JonofAllTrades是后一种情况。这是一个完全没有答案的问题,因为你有点错过了我认为OP的要点——他问如何计划这一点。@TomTomTom我实际上不同意——我只是编辑添加了更多细节,但很大程度上取决于任务在做什么。考虑到OP描述的行为,很可能是资源争用或CPU受限,在这两种情况下,限制任务的数量是有益的。