【问题标题】:WithDegreeOfParallelism .Net TaskWithDegreeOfParallelism .Net 任务
【发布时间】:2025-11-25 15:55:01
【问题描述】:

我真的不明白何时使用 WithDegreeOfParallelism 以及它如何提高性能?

不确定在什么情况下限制执行查询的最大任务数

【问题讨论】:

    标签: .net task parallel-processing


    【解决方案1】:

    搜索时的第二个链接给出了Introduction to PLINQ 页面,其中给出了两个示例:

    当您想确保计算机上运行的其他进程获得一定量的 CPU 时间时,这很有用。

    在查询执行大量非计算密集型工作(例如文件 I/O)的情况下,指定并行度大于机器上的内核数可能会有所帮助。

    如果这些都不吸引您,或者与您使用 PLINQ 的方式相匹配,并且您想不出任何其他情况(例如,如果他们将竞争使用其他具有有限资源的资源)可用的实例数)然后我建议将其排除在外。

    【讨论】:

    • 人们会建议使用more线程和IO,这很有趣。因为这取决于硬件,但据我所知,最好为 IO 使用 更少 线程,以减少上下文切换的时间和支持多线程所需的相关 IO 工作。
    • 对不起,我还是不明白,为什么你在做文件/IO的时候想要更多的线程。更改正在使用的 CPU 数量如何改变进程获得的 CPU 时间
    • @AllenHo - 它不会影响一个进程获得多少 CPU 时间 - 但它确实允许更多 IO 操作同时“运行” - 每个涉及的线程都不是 尝试使用CPU。
    • @Damien_The_Unbeliever inflight --- 在哪个核心上?他们都是 ?每个 ? plinq 不是在每个核心上划分线程吗?你能解释一下吗?
    • @RoyiNamir - 当我们谈论 IO 操作“正在运行”时,我们的意思是 IO 硬件正在执行操作,并且我们正在等待来自硬件的信号返回该操作已完成。所以他们不在任何核心上运行——这就是重点——他们不需要核心,他们在机器内部使用其他硬件。
    【解决方案2】:

    您可以在并行循环中使用此方法。比如我在DataGridView的记录过程中使用了parallizm。

    int tasks = Environment.ProcessorCount;
    DataGrid.Rows.AsParallel().OfType<DataGridViewRow>().WithDegreeOfParallelism(tasks).ForAll(i =>
    {
      // some code
    });
    

    默认情况下,DegreeOfParallelism 等于处理器内核数。此参数定义在处理时将创建多少并发任务(即线程)。当我使用默认程度(4 核)时,我的应用程序“挂起”了一点,所以我决定将并行度降低到 2。无论如何,您应该根据需要选择此参数的值(或让用户选择强制他做出选择;))

    【讨论】:

      最近更新 更多