当前位置: 首页 > 编程语言 > C#

Parallel.ForEach执行过程中是否可以改变parallelOptions.MaxDegreeOfParallelism分享

时间:2023-04-10 20:35:22 C#

MaxDegreeOfParallelism=2;Parallel.ForEach(items,parallelOptions,item=>{//此处循环代码});我想在执行并行循环期间更改parallelOptions.MaxDegreeOfParallelism以减少或增加一些线程。parallelOptions.MaxDegreeOfParallelism=5;它似乎没有增加线程。有人有什么想法吗?甚至尝试这样做的问题是这是一个难题。对于初学者,您如何可靠地观察CPU和磁盘利用率?不经常对CPU进行采样会让人很难看清实际发生了什么,而对磁盘利用率进行采样就更难了。其次,您的任务的粒度是多少,您实际更改正在运行的数字的速度有多快。第三,事情会随着时间的推移而迅速变化,因此您需要对您的观察结果进行某种过滤。第四,理想的线程数取决于代码实际运行的CPU。第五,如果你分配了太多的线程,你会在它们之间挣扎而不是做有用的工作。有关.NET中的线程池如何处理决定使用多少线程的复杂任务的讨论,请参阅http://msdn.microsoft.com/en-us/magazine/ff960958.aspx。您还可以使用反射器并查看TPL用于分配线程并避免不必要的上下文切换的代码-它很复杂,甚至不考虑磁盘访问!您可以尝试在优先级较低的线程上执行任务(创建自己的TaskScheduler以运行优先级低于正常的线程实际上非常简单)。这至少可以确保您可以100%地运行CPU而不会影响系统的其余部分。弄乱线程优先级本身就充满了问题,但如果这是一个纯粹的后台任务,它可能是直截了当的,而且可能会有帮助。通常情况下,磁盘利用率是其他应用程序进行贪婪应用程序攻击的真正罪魁祸首。Windows可以很容易地在应用程序之间公平地分配CPU,但是当涉及到相对较慢的磁盘访问时,情况就不同了。您可能不想尝试动态调整运行的线程数,而是想简单地限制应用程序,使其不经常访问磁盘。这是您可以在不更改活动线程数的情况下执行的操作。您还可以将SetPriorityClass视为一种通知操作系统您的进程不如系统上运行的其他应用程序重要的方式,请参阅如何增加进程的I/O优先级?了解更多信息。但这是假设您的整个过程并不那么重要,而不仅仅是这一部分。我不希望在调用ForEach后能够更改并行度。据我所知,ForEach将确定它可以创建多少个线程,创建多个分区,并创建在这些分区上运行的线程。它没有意义,它可以说,“哦等等,他改变了我们的资源分配,让我重新分区数组并重新分配线程。”以上是C#学习教程:Parallel.ForEach执行过程中是否可以更改parallelOptions.MaxDegreeOfParallelism分享的所有内容如果对你有用,还需要进一步了解C#学习教程,希望大家多多付出注意它。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: