Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET减少了重复运行时的并行线程_.net_Multithreading_Task Parallel Library - Fatal编程技术网

.NET减少了重复运行时的并行线程

.NET减少了重复运行时的并行线程,.net,multithreading,task-parallel-library,.net,Multithreading,Task Parallel Library,NET是否有充分的理由随着时间的推移减少并行线程的数量 我在许多过程中运行计算,需要几天才能完成(每个过程大约需要1小时)。这些任务纯粹是计算内存中的数据(从磁盘读取)。我使用了Parallel.For和Parallel.ForEach几个地方,包括主任务和任务内部。每件事都是多次重复的。对于每个过程,类实例都被正确地释放(内存探查器显示随着时间的推移没有问题),并创建一个新实例。它在每个过程中重复100%相同的任务,但数学中的某些数字发生了变化(每次迭代次数相等,数据集相同) 这台电脑有六个内

NET是否有充分的理由随着时间的推移减少并行线程的数量

我在许多过程中运行计算,需要几天才能完成(每个过程大约需要1小时)。这些任务纯粹是计算内存中的数据(从磁盘读取)。我使用了
Parallel.For
Parallel.ForEach
几个地方,包括主任务和任务内部。每件事都是多次重复的。对于每个过程,类实例都被正确地释放(内存探查器显示随着时间的推移没有问题),并创建一个新实例。它在每个过程中重复100%相同的任务,但数学中的某些数字发生了变化(每次迭代次数相等,数据集相同)

这台电脑有六个内核,应用程序一开始就使用了所有内核。一段时间后,它使用5,然后4,然后3,然后2。查看并行堆栈(Debug->Window->Parallel stacks),它确认只有很多正在运行

为什么.NET没有在每次通过时都将线程数增加到最大?它是否根据CPU使用情况调节线程


关于如何调试的提示?我可以强制使用多少线程吗?

我认为这篇文章应该提供一些线索

由并行方法创建的任务最终将由线程池执行。线程池要使用的理想线程数因正在执行的任务类型而异。如果任务阻塞很多并且没有太多争用,那么线程数量越多,吞吐量就会越高。对于没有太多阻塞和对有限资源的高争用的任务,较低的线程数将导致较高的吞吐量

由于此属性,.NET4中的线程池实现了一个“爬山”算法,在该算法中,它调整线程池正在运行的线程数,并根据测量的吞吐量作出反应

因此,您可以检查的一件事是,实际作业吞吐量是否随着线程数的减少而减少。还有一种可能是,当你的应用程序运行时,它的磁盘操作越来越多,线程被停止使用


至于强制线程池使用一定数量的线程,我认为这是不可能的。但这对我来说从来都不起作用。通常.NET只会忽略这些值,并使用它想要的任意数量的线程。

@Skomski:这是一个建议,而不是强制的@Tedd:要强制执行,必须使用PLINQ和
。带degreeofparallelism(value)
或自己显式创建线程。最大线程数: