0

我有三个任务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 完成,这是不必要的。

那么,是否有一个很好的干净解决方案,或者我是否需要开始进行回调等等?

4

4 回答 4

6

您可以使用 TPL 中的任务。

您可以同时运行任务 B 和 A,然后让任务 C 作为任务 B 的延续运行

例如

Task.Factory.StartNew(()=>TaskA());
Task.Factory.StartNew(()=>TaskB()).ContinueWith(t=>TaskC(t));

在TaskB的延续中,可以传入Task来获取TaskB的任意结果传入TaskC方法中。

于 2012-07-13T12:32:17.090 回答
2

将一个任务添加到并行任务列表中,由谁负责依次执行串行任务呢?

于 2012-07-13T12:29:47.753 回答
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();
于 2012-07-13T12:31:01.973 回答
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
于 2012-07-13T16:39:10.667 回答