组织异步任务

时间:2012-07-13 12:26:24

标签: c# .net task-parallel-library

我有三个任务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 个答案:

答案 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