如何使用C# .net 4.0在最大定义并行线程中运行任务

3

我有一个方法,想要在10个不同的并行线程中运行,所有线程都是独立的,彼此之间没有依赖关系。我的问题是,如果我有100个要处理的项目,并且想一次性处理10个,那么如何才能一次运行10个呢? 我创建了一个示例代码,其中使用了Parallel.ForEach,但我需要设置什么才能使其每次运行10个线程,并且当某个正在运行的任务已完成时,它应该自动开始新任务,因此除非所有项目都已完成,否则所有10个线程都应该保持繁忙状态。

    private void StartAccuracyCalculator()
    {
        List<MaterialComposition> lstMaterialComposition = DataHelper.GetMaterialComposition();

        Parallel.ForEach(lstMaterialComposition, composition =>
        {
            try
            {
                CalculateAccuracy(composition);
            }
            catch (Exception ex)
            {
                //LogException(ex)
            }
        });

    }


    private void CalculateAccuracy(MaterialComposition composition)
    {
        /// actual process to perform 
    }

假设 lstMaterialComposition 从数据库中获取了100条记录,因此在 Parallel.ForEach 中,我希望每次只运行10个项目,并且任何10个项目完成后,下一个项目从 lstMaterialComposition 开始。

请建议是否可以通过 Parallel.ForEach 实现,或者是否有其他选项可供选择?

1个回答

6

您可以使用ParallelOptions.MaxDegreeOfParallelism属性来限制任务的数量。

MaxDegreeOfParallelism MaxDegreeOfParallelism属性会影响传递此ParallelOptions实例的Parallel方法调用所运行的并发操作的数量。正数属性值将限制并发操作的数量为设定值。如果它是-1,则没有限制正在同时运行的操作的数量。

Parallel.ForEach(
    lstMaterialComposition,
    new ParallelOptions { MaxDegreeOfParallelism = 10 },
    composition => { 
            try
            {
                CalculateAccuracy(composition);
            }
            catch (Exception ex)
            {
                //LogException(ex)
            }
     }
);

谢谢Adil,设置新的ParallelOptions { MaxDegreeOfParallelism = 10 }会自动接管下一个任务吗? - Neeraj Kumar Gupta
是的,@Neeraj Kumar Gupta。 - Adil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接