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

Nee*_*pta 3 c# multithreading threadpool task-parallel-library

我有1个方法,我想在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 
    }
Run Code Online (Sandbox Code Playgroud)

假设lstMaterialComposition从DB获取100条记录,所以Parallel.ForEach我想一次只运行10个项目,并且10个中的任何一个已经完成,因此lstMaterialComposition应该开始下一个项目.

请建议是否可以,Parallel.ForEach或者还有其他选择吗?

Adi*_*dil 6

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

MaxDegreeOfParallelism MaxDegreeOfParallelism属性影响通过此ParallelOptions实例传递的并行方法调用所运行的并发操作数.正属性值将并发操作的数量限制为设置值.如果为-1,则对并发运行的操作数没有限制.

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