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谢谢您的回复。这就是我难以理解的事情。