c# - 运行 多组并行线程 (Parallel.ForEach)
c# - running multiple sets of parallel threads (Parallel.ForEach)
我正在尝试 运行 两组并行任务。我的 task.Invoke() 方法是异步的,所以在第一组任务中,我离开了 .Wait();但在第二组中,我使用 .Wait() 因此在所有任务实际完成之前它不会退出并行组。
这通常是因为 A 组任务开始,然后 B 组任务开始,所有任务在他们的组内并行工作,A 组 运行ning 将 B 组 运行s并且组 b 在其任务的所有任务完成之前不会退出。
var parallelA = new List<IMyTask>();
parallelA.Add(new MyTask());
parallelA.Add(new MyTask());
await Task.Run(() => Parallel.ForEach(parallelA, task =>
{
task.Invoke();
}));
var parallelB = new List<IMyTask>();
parallelB.Add(new MyTask());
parallelB.Add(new MyTask());
await Task.Run(() => Parallel.ForEach(parallelB, task =>
{
task.Invoke().Wait();
}));
问题是 a 组任务不一定在 b 组任务完成之前完成,因此在某些情况下,当 a 组仍在 运行ning 时函数退出。
我想我可以重写它以便它们都可以互操作,可能是通过使用任务集合的集合进行并行循环的并行循环,但这是否会对线程管理等产生一些不利影响在clr里面?
背景是我有一个间隔运行s的后台进程,我把它运行s的任务分成两组,A组是一对长运行ning 任务和 B 组是存储在队列中的一系列短 运行ning 任务。两组具有相同的优先级,具有相同的开始和停止时间,队列可以在时间到时停止,任何任务都可以在下一个周期重新启动。
你可以直接使用WhenAll
var parallelA = new List<IMyTask>();
parallelA.Add(new MyTask());
parallelA.Add(new MyTask());
var task1 = Task.Run(() => Parallel.ForEach(parallelA, task =>
{
task.Invoke();
}));
var parallelB = new List<IMyTask>();
parallelB.Add(new MyTask());
parallelB.Add(new MyTask());
var task2 = Task.Run(() => Parallel.ForEach(parallelB, task =>
{
task.Invoke().Wait();
}));
await Task.WhenAll(task1, task2);
注意,虽然可能有更好的方法来做到这一点,但您可以只使用任务列表而不使用 Parallel.ForEach
,尽管您使用的是IMyTask 界面及其难以推断发生了什么
我正在尝试 运行 两组并行任务。我的 task.Invoke() 方法是异步的,所以在第一组任务中,我离开了 .Wait();但在第二组中,我使用 .Wait() 因此在所有任务实际完成之前它不会退出并行组。
这通常是因为 A 组任务开始,然后 B 组任务开始,所有任务在他们的组内并行工作,A 组 运行ning 将 B 组 运行s并且组 b 在其任务的所有任务完成之前不会退出。
var parallelA = new List<IMyTask>();
parallelA.Add(new MyTask());
parallelA.Add(new MyTask());
await Task.Run(() => Parallel.ForEach(parallelA, task =>
{
task.Invoke();
}));
var parallelB = new List<IMyTask>();
parallelB.Add(new MyTask());
parallelB.Add(new MyTask());
await Task.Run(() => Parallel.ForEach(parallelB, task =>
{
task.Invoke().Wait();
}));
问题是 a 组任务不一定在 b 组任务完成之前完成,因此在某些情况下,当 a 组仍在 运行ning 时函数退出。
我想我可以重写它以便它们都可以互操作,可能是通过使用任务集合的集合进行并行循环的并行循环,但这是否会对线程管理等产生一些不利影响在clr里面?
背景是我有一个间隔运行s的后台进程,我把它运行s的任务分成两组,A组是一对长运行ning 任务和 B 组是存储在队列中的一系列短 运行ning 任务。两组具有相同的优先级,具有相同的开始和停止时间,队列可以在时间到时停止,任何任务都可以在下一个周期重新启动。
你可以直接使用WhenAll
var parallelA = new List<IMyTask>();
parallelA.Add(new MyTask());
parallelA.Add(new MyTask());
var task1 = Task.Run(() => Parallel.ForEach(parallelA, task =>
{
task.Invoke();
}));
var parallelB = new List<IMyTask>();
parallelB.Add(new MyTask());
parallelB.Add(new MyTask());
var task2 = Task.Run(() => Parallel.ForEach(parallelB, task =>
{
task.Invoke().Wait();
}));
await Task.WhenAll(task1, task2);
注意,虽然可能有更好的方法来做到这一点,但您可以只使用任务列表而不使用 Parallel.ForEach
,尽管您使用的是IMyTask 界面及其难以推断发生了什么