Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# maxDegreeOfParallelism是否每隔一个Parallel.ForEach停止创建新任务?_C#_Task_Parallel.foreach - Fatal编程技术网

C# maxDegreeOfParallelism是否每隔一个Parallel.ForEach停止创建新任务?

C# maxDegreeOfParallelism是否每隔一个Parallel.ForEach停止创建新任务?,c#,task,parallel.foreach,C#,Task,Parallel.foreach,如果有两个Parallel.ForEach循环且maxDegreeOfParallelism=3,那么这两个循环都将只运行3个线程吗 或 我们可以将生成的线程数限制为特定的数目吗 我有一个需要并行的代码。ForEach两次,他们只有一个task.Start()调用 我的问题是,如果我在两个Parallel.ForEach循环中都指定maxdegreeofpparallelism=3,那么这通常适用吗?也就是说,如果已经有3个线程正在运行,那么另一个并行.ForEach是否不会调用操作 这只是一个

如果有两个
Parallel.ForEach
循环且
maxDegreeOfParallelism=3
,那么这两个循环都将只运行3个线程吗

我们可以将生成的线程数限制为特定的数目吗

我有一个需要并行的代码。ForEach两次,他们只有一个task.Start()调用

我的问题是,如果我在两个
Parallel.ForEach
循环中都指定
maxdegreeofpparallelism=3
,那么这通常适用吗?也就是说,如果已经有3个线程正在运行,那么另一个
并行.ForEach
是否不会调用操作

这只是一个演示类型的代码,不是真实的代码。出于某些原因,我不想分享实际的功能。只有
子任务.Add(()=>{})
部分不同,其余部分相同

    async static void myFunction()
    {
        List<Task> tasks = new List<Task>();
        for (int i = 0; i < 5; i++)
        {
            int m = i + 1;
            List<Task> subTasks = new List<Task>();
            for (int j = 0; j < 3; j++)
            {
                int n = j + 1;
                subTasks.Add(new Task(async () => {
    //the actual work i want done will go in here
                    Console.WriteLine("Executing Task " + m + "." + n);
                    await Task.Delay(5000);
                    Console.WriteLine("Completed Task " + m + "." + n);
                }));
            }

            tasks.Add(new Task(async () => {
                Console.WriteLine("Executing Task " + m);
                Parallel.ForEach(subTasks, new ParallelOptions() { MaxDegreeOfParallelism = 3 }, 
                    subTask => {
                    subTask.Start();
                });
                await Task.WhenAll(subTasks);
                Console.WriteLine("Completed Task " + m);
            }));
        }

        Parallel.ForEach(tasks, new ParallelOptions() { MaxDegreeOfParallelism = 3 }, task => { task.Start(); });
        await Task.WhenAll(tasks);
    }
异步静态void myFunction()
{
列表任务=新列表();
对于(int i=0;i<5;i++)
{
int m=i+1;
列表子任务=新建列表();
对于(int j=0;j<3;j++)
{
int n=j+1;
添加(新任务(异步()=>{
//我想要完成的实际工作将在这里进行
Console.WriteLine(“正在执行任务”+m+“+n”);
等待任务。延迟(5000);
Console.WriteLine(“已完成任务”+m+”+n);
}));
}
添加(新任务(异步()=>{
Console.WriteLine(“执行任务”+m);
ForEach(子任务,新的ParallelOptions(){MaxDegreeOfParallelism=3},
子任务=>{
子任务Start();
});
等待任务时(子任务);
Console.WriteLine(“已完成任务”+m);
}));
}
ForEach(任务,新的ParallelOptions(){MaxDegreeOfParallelism=3},任务=>{task.Start();});
等待任务。何时(任务);
}
如果总共有3个线程正在运行,我希望
Parallel.ForEach
循环不会调用更多操作


另外,如果有其他方法可以做到这一点,如果有人能提供帮助,我将不胜感激。

异步和并行。*不要混用。使用Parallel.ForEach()启动任务似乎是非常不必要和不明智的。外部函数是
async void
,这可能不是您需要/想要的。MaxDegreeOfParallelism指的是特定的
Parallel.ForEach
循环。因此,如果有两个运行时使用了
MaxDegreeOfParallelism=3
,它可以运行3x2并发操作。@HenkHolterman感谢您的响应。异步是为了我可以调用
wait Task.WhenAll(tasks)
。所以我应该选择
Task.WaitAll(tasks.ToArray())
对吗?因为我想等待所有任务完成后再继续。@404谢谢您的回复。这就是我在理解.async和Parallel时遇到的问题。*不要很好地混合。使用Parallel.ForEach()启动任务似乎是非常不必要和不明智的。外部函数是
async void
,这可能不是您需要/想要的。MaxDegreeOfParallelism指的是特定的
Parallel.ForEach
循环。因此,如果有两个运行时使用了
MaxDegreeOfParallelism=3
,它可以运行3x2并发操作。@HenkHolterman感谢您的响应。异步是为了我可以调用
wait Task.WhenAll(tasks)
。所以我应该选择
Task.WaitAll(tasks.ToArray())
对吗?因为我想等待所有任务完成后再继续。@404谢谢您的回复。这就是我难以理解的事情。