建模:具有依赖关系的并行队列

时间:2017-01-05 12:42:52

标签: c# parallel-processing queue

我有一个非常复杂的设置,需要一些输入如何解决它。

我有一个由任务1,2a,2b,2c,3a,3b,3c和4组成的进程A.

任务1必须首先运行,而不是并行执行其他任务。

任务2a,2b,2c必须一个接一个地运行,但可以与3a,3b,3c并行执行(也必须一个接一个地运行。任务4只能在3c和2c完成后运行

我首先通过优先级队列实现了这一点,并尝试使用优先级管理它,并且只使用一种只出现一种意义的机制,2a和3a可以同时出列,2b和3b等等。

但是如果3a完成并且可以启动3b,则必须等到2a也完成。我需要一个可以处理我的情况的队列机制的想法。我知道这很复杂,但任何提示都可能对我有帮助。

1 个答案:

答案 0 :(得分:0)

Whith asyncawait您的解决方案将如下所示(假设您有方法Run...Async来运行您的个别任务并返回任务):

async Task RunTasks2Async() {
     await RunTask2aAsync();
     await RunTask2bAsync();
     await RunTask2cAsync();
}

async Task RunTasks3Async() {
     await RunTask3aAsync();
     await RunTask3bAsync();
     await RunTask3cAsync();
}

async Task RunAllTasks()
{
    await RunTask1();
    Task task2 = RunTasks2Async();
    Task task3 = RunTasks3Async();
    await Task.WhenAll(task2, task3);
    await RunTask4Async();
}

如果您不想使用async / await,可以使用Task.ContinueWith执行任务的串行执行,并使用Task.WhenAll执行并行执行。