我有三个任务A,B,C。
B必须在C之前运行,但A可以与它们并行运行。这是最近改变的逻辑,我们目前的逻辑运作良好,我只是想知道我们现有的是否有更好的解决方案:
public void RunTasks(...) {
Action<IRunnableTask> runner = task =>
{
if (task.ShouldRun(request))
{
task.Run(request, response);
}
};
// run parallel tasks
Parallel.ForEach(parallelTasks, runner);
// run serial tasks
Array.ForEach(serialTasks, runner);
}
这里,A和B是并行任务,C在串行任务列表中。问题在于,代码将在C可以启动之前等待A完成,这是不必要的。
那么,是否有一个很好的清洁解决方案,或者我是否需要开始进行回调等等?
答案 0 :(得分:6)
您可以使用TPL中的任务。
您可以同时运行任务B和A,然后将任务C作为任务B的继续运行
e.g。
Task.Factory.StartNew(()=>TaskA());
Task.Factory.StartNew(()=>TaskB()).ContinueWith(t=>TaskC(t));
在TaskB的延续中,您可以传递Task以获取TaskB传递给TaskC方法的任何结果。
答案 1 :(得分:2)
如何将任务添加到并行任务列表中,其任务是一个接一个地执行串行任务?
答案 2 :(得分:0)
类似的东西:
Action taskACallback = () => { };
Action taskBCallback = () => { };
Action taskCCallback = () => { };
Task taskA = new Task(taskACallback);
Task taskC = new Task(taskCCallback);
Task taskB = new Task(taskBCallback).ContinueWith(t => taskC.Start());
taskA.Start();
taskB.Start();
答案 3 :(得分:0)
只是sll答案的略微修改版本,因为我不确定编辑代码的礼节是什么。
Action taskACallback = () => Console.WriteLine ("Task A");
Action taskBCallback = () => Console.WriteLine ("Task B");
Action<Task> taskCCallback = task => Console.WriteLine ("Task C, continued off of task with status {0}", task.Status);
Task taskA = new Task(taskACallback);
Task taskB = new Task(taskBCallback);
Task taskC = taskB.ContinueWith(taskCCallback);
taskA.Start();
taskB.Start();
这给出了控制台输出:
Task A
Task B
Task C, continued off of task with status RanToCompletion