【发布时间】:2018-03-02 12:00:46
【问题描述】:
我是 C# 线程和任务的新手,我正在尝试开发一个工作流但没有成功,可能是因为我将任务与迭代混合...
重点是:
我有一堆列表,在每个列表中都有一些事情要做,并且需要使它们尽可能多地并行工作并且尽可能减少阻塞,并且一旦每个 subBunchOfThingsTodo 完成(这意味着每一件事在里面做是并行完成的)它做了一些事情(DoSomethingAfterEveryThingToDoOfThisSubBunchOfThingsAreDone())。
例如:
bunchOfSubBunchsOfThingsTodo
-
subBunchOfThingsTodo
- ThingToDo1
- ThingToDo2
-
subBunchOfThingsTodo
- ThingToDo1
- ThingToDo2
- ThingToDo3
-
subBunchOfThingsTodo
- ThingToDo1
- ThingToDo2...
这就是我正在尝试的方式,但不幸的是,每次迭代都会等待前一个 bundleOfThingsToDo,我需要它们并行工作。 要做的事情也是如此,他们等待上一件事情开始......
List<X> bunchOfSubBunchsOfThingsTodo = getBunchOfSubBunchsOfThingsTodo();
foreach (var subBunchOfThingsToDo in bunchOfSubBunchsOfThingsTodo)
{
int idSubBunchOfThingsToDo = subBunchOfThingsToDo.ThingsToDo.FirstOrDefault().IdSubBunchOfThingsToDo;
var parent = Task.Factory.StartNew(() =>
{
foreach (var thingToDo in subBunchOfThingsToDo.ThingsToDo)
{
var child = Task.Factory.StartNew(() =>
{
//Do some stuff with thingToDo... Here I call several business methods
});
}
});
parent.Wait();
DoSomethingAfterEveryThingToDoOfThisSubBunchOfThingsAreDone(idSubBunchOfThingsToDo);
}
【问题讨论】:
-
这是 business CPU 绑定吗?
-
如果您的“任务”彼此独立且足够大,请查看 Parallel.ForEach。
-
Use
Task.RunnotTask.Factory.StartNew。不是你的问题,但有一些非常具体的情况应该使用 StartNew,我猜这不是其中之一 -
Parallel.ForEach可能是这里的路 -
@fgc 你的真正目标是什么?不要描述你尝试了什么,描述你想要什么。您想在背景中执行工作而不阻塞用户界面吗?或者进行很多远程调用,因此是异步调用?或者执行一些 CPU 繁重的工作?不同的要求,不同的等级。例如,您可以将
Parallel.ForEach(subBunchOfThingsToDo.ThingsToDo, thingToDo =>WorkKnowingItsParallelAlready(thingToDo))用于 CPU 密集型工作
标签: c# multithreading task