如何指定的Parallel.ForEach执行的并行任务的数量?数量、任务、Parallel、ForEach

2023-09-05 03:33:12 作者:昔年°/21c

我有〜500的任务,他们每个人的花费约5 seconds其中大部分时间是在等待远程资源的答复浪费。我想定义应催生了我自己(在一些测试)的线程数和运行这些线程的任务。当一个任务完成后,我想产卵,成为可用的线程上执行其他任务。

我发现 System.Threading.Tasks 最容易达到我想要的,但我认为这是不可能的指定应并行执行的任务数量。对于我的机器,它总是围绕8(四核CPU)。是否有可能以某种方式告诉多少任务应该并行地执行?如果不是这将是实现我想要的最简单的方法? (我试图与线程,但code是复杂得多)。我试图增加 MaxDegreeOfParallelism 参数,但只限制了最大数量,因此在这里没有运气...

这是在code,我有当前:

 使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用System.Threading.Tasks;

命名空间ConsoleApplication1
{
    类节目
    {
        私有静态列表<字符串> _list =新的名单,其中,串>();
        私有静态诠释_toProcess = 0;

        静态无效的主要(字串[] args)
        {
            的for(int i = 0; I< 1000; ++ I)
            {
                _list.Add(参数+ I);
            }

            变种W =新员工();
            VAR W2 =新StringAnalyzer();

            Parallel.ForEach(_list,新ParallelOptions(){MaxDegreeOfParallelism = 32},项=>
            {
                ++ _麦克罗公司一直供应;
                字符串数据= w.DoWork(项目);
                w2.AnalyzeProcessedString(数据);
            });

            Console.WriteLine(完成);
            Console.ReadKey();
        }

        静态无效完成(任务<字符串> T)
        {
            Console.WriteLine(t.Result);
            --_麦克罗公司一直供应;
        }
    }

    班工人
    {
        公共字符串的DoWork(串杆)
        {
            //这是一个长期运行的,但不是CPU任务繁重(下载东西来自互联网)
            System.Threading.Thread.Sleep(5000);
            回归面值+加工;
        }
    }

    类StringAnalyzer
    {
        公共无效AnalyzeProcessedString(字符串数据)
        {
            //比较短,没有CPU重
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine(数据+和分析);
        }
    }
}
 

解决方案

由于LB提到,.NET Framework有执行I / O操作(请求数据库,Web服务等)的